zoukankan      html  css  js  c++  java
  • 数据结构实训二——栈与队列

    1.实验目的:
    (1)掌握顺序栈的和链队列的实现;
    (2)能利用栈和队列的基本运算解决实际问题;
    2.实验要求:
    车场是一个可停放n辆汽车的狭长通道,且只有一个大门可供进出(栈结构)。
    汽车在停车场内按车辆到达的先后顺序依次排列。
    若停车场内的已停满汽车,则后来的车只能在门外的变道上等候,一旦停车场内有车开走,
    则排在便道上的第一辆车即可进入(队列结构)。
    每辆停放在停车场的车,在离开时按其在停车场停留时间长短交费(在这里假设车不能从门外等侯便道上直接开走)。
    试设计一个实现停车场管理的程序,按照从终端输入数据序列进行模拟管理 。
    (1) 采用顺序栈和链式队列实现;
    (2) 每一组输入数据包括三个数据项:汽车牌照,到达或离去的标记和时刻。;
    (3) 对每一组输入数据进行操作后的输出信息为:车辆到达:输出车辆在停车场或便道上的停车位置;车辆离去:输出停留时间和费用(在便道上等候不收费)
    3.实验代码:
    (懒得改手写栈和队列了,stl真快乐)

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=110;
    struct node
    {
        string id;///车牌号
        int flag;///表示是到达还是离开:到达是1,离开是0
        int time;///表示到达或离开的时间
    };
    map<string,bool>mp;///停车场是否有该车
    int n,cost;
    stack<node>stk;
    queue<node>q;
    
    void showmain()
    {
        cout<<"**********菜单*************"<<endl;
        cout<<"1.修改停车场的容量"<<endl;
        cout<<"2.输入车辆信息"<<endl;
        cout<<"3.修改停车一小时的费用"<<endl;
        cout<<"4.查看停车场的车辆情况"<<endl;
        cout<<"5.查看变道的车辆情况"<<endl;
        cout<<"6.退出系统"<<endl;
    }
    
    void change_n()
    {
        int tmp;
        cin>>tmp;
        if(tmp>n)
        {
            while(stk.size()<=n)
            {
                node t=q.front();
                t.time=t.time;
                q.pop();
                stk.push(t);
                mp[t.id]=1;
            }
        }
        else
        {
            while(stk.size()>n)
            {
                node t=stk.top();
                stk.pop();
                mp[t.id]=0;
                q.push(t);
            }
        }
        n=tmp;
    }
    
    void change_cost()
    {
        cin>>cost;
    }
    
    void add_car()
    {
        cout<<"请输入车辆的相关信息:"<<endl;
        node t;
        cin>>t.id>>t.flag>>t.time;
        if(t.flag) //到达
        {
            if(stk.size()==n)
            {
                q.push(t);///停车场满了,只在路上停留
                cout<<"车牌号为"<<t.id<<"的车在路上的"<<q.size()<<"号位置"<<endl;
            }
            else
            {
                stk.push(t);///直接将车停到停车场里
                cout<<"车牌号为"<<t.id<<"的车在停车场的"<<stk.size()<<"号位置"<<endl;
                mp[t.id]=1;
            }
        }
        else ///离开
        {
            if(!mp[t.id])
            {
                puts("停车场没有该车");
                return ;
            }
            mp[t.id]=0;
            node tt=stk.top();
            stk.pop();
            while(stk.size()<n&&!q.empty())
            {
                node tmp=q.front();
                tmp.time=t.time;
                q.pop();
                stk.push(tmp);
                mp[tmp.id]=1;
            }
            cout<<"车牌号为"<<t.id<<"的车的花费为"<<(t.time-tt.time)*cost<<endl;
        }
        cout<<stk.size()<<"*************"<<q.size()<<endl;
    }
    
    void show_park()
    {
        ///先进后出
        vector<node>v;
        int cnt=stk.size();
        while(!stk.empty()){
            v.push_back(stk.top());
            cout<<"车牌号为"<<stk.top().id<<"的车在停车场的"<<cnt--<<"号位置"<<endl;
            stk.pop();
        }
        reverse(v.begin(),v.end());
        for(int i=0;i<v.size();i++){
            stk.push(v[i]);
        }
    }
    
    void show_road()
    {
        vector<node>v;
        int cnt=1;
        while(!q.empty()){
            v.push_back(q.front());
            cout<<"车牌号为"<<q.front().id<<"的车在路上的"<<cnt++<<"号位置"<<endl;
            q.pop();
        }
        for(int i=0;i<v.size();i++){
            q.push(v[i]);
        }
    }
    
    int main()
    {
        puts("请输入停车场的容量:");
        cin>>n;
        puts("请输入停车一小时的费用:");
        cin>>cost;
        while(1)
        {
            showmain();
            cout<<"请输入您想进行的操作:"<<endl;
            int op;
            cin>>op;
            if(op==1) change_n();
            else if(op==2) add_car();
            else if(op==3) change_cost();
            else if(op==4) show_park();
            else if(op==5) show_road();
            else if(op==6) return 0;
        }
        return 0;
    }
    
    
  • 相关阅读:
    什么是Flex 布局
    wx.navigateTo、wx.redirectTo和wx.switchTab三种导航方式的区别
    Ajax 工作原理 及 实例
    NodeJS之 Express框架 app.use(express.static)
    Parcel 入门 (一)
    打包工具的介绍
    CSS网页布局
    《拖延心理学》阅读要点
    PHP实现页面静态化
    PHP中的魔术方法
  • 原文地址:https://www.cnblogs.com/OvOq/p/14853057.html
Copyright © 2011-2022 走看看