数据结构实训二——栈与队列

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;
}

posted @ 2020-12-23 13:04  OvO1  阅读(101)  评论(0编辑  收藏  举报