C++ 栈和队列的应用

啊!
  这个题为什么写博客呢?我是智障吗?不我不是!!!我只是被这个题坑了。也可能是我最近太丧了不爱刷题。(✺ω✺)刚开始我规规矩矩写了栈和队列结果被坑惨了,我没用标准库直接手写栈和队列,300行代码出了bug不想改,就导致我好几天都没交这个题 (其实是我傻) 。 并且我把这个题想的太机智了。ok下面看题,废话已经划掉了!!!

先说一下注意问题:

  1. 如果要按照题目要求写就好好读题。
    1.1离开的车可能不在头上,在中间嗷。
  2. 第二坑:如果车离开,并且车不在停车场内,到此为止。不要考虑这个车在不在便道上。
  3. 如果一辆车从停车场离开之后,便道上的另一辆进行补位,那么它进入停车场的时间就是上一辆车离开的时间。
  4. 题我A出来了,但是我用链表写的……最近有点丧,(´;ω;`)等我心情好点我会补上标准答案的……

题目描述:
  设停车场是一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。 汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在停车场的最北端),若停车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入停车场;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路待该辆车开出大门外,其他车辆再按原次序进入车场; 每辆停放在车场的车在它离开停车场时,必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。
▶ Tips:
  看到绿色的字了吗,这个就是决定你按不按常规做的关键。如果你按照这句话写,并且还不用STL那你就是找罪受了,不过你要想好好练习就按照人家要求写吧。

输入:
  输入数据的第一行包含两个正整数n和m(n,m<=10)分别表示停车场的容量和每小时停车费用。从第2行开始,每行表示一组输入数据,由三项内容构成:

  1. 一个大写英文字母,表示汽车“到达”或“离开”信息:
    • 输入’A’时,表示汽车达到,
    • 输入’D’时,表示汽车离开,
    • 输入’E’时,表示程序结束;
  2. 一个正整数X,表示汽车牌照号;
  3. 一个正整数T,表示汽车到达或离开的时刻。

这三项内容之间以一个空格间隔。

输出:
  对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离开,则输出汽车在停车场内停留的时间(单位是小时)和应交纳的费用(在便道上停留的时间不收费),假设停车费为每小时m元。具体分为如下几种情况:

  1. 如果汽车X到达,且停车场未满,则输出如下信息:“汽车X停靠在停车场Y号位置”(其中:X为汽车牌照号,Y为停车场车位序号,1≤Y≤n)
  2. 如果汽车X到达,但停车场已满,则输出如下信息:“汽车X停靠在便道的Z号位置”(其中:X为汽车牌照号,Z为便道的车位序号,1≤Z)
  3. 如果汽车X离开,且X在停车场内,则输出如下信息:“汽车X停车H小时,缴纳停车费M元”(其中:X为汽车牌照号,H为停车时间,M为停车费用)
    3.1 如果此时便道上的停车队列不为空,则将便道上的第一辆汽车停入停车场,并输出如下信息:“汽车X停靠在停车场Y号位置”(其中:X为汽车牌照号,Y为停车场车位序号,1≤Y≤n)
  4. 如果汽车X离开,但停车场没有牌照X的汽车,则输出如下信息:“汽车X不在停车场”(其中:X为汽车牌照号)

样例输入:

4 5
A 1 10
A 2 15
A 3 16
D 4 17
D 3 20
A 4 21
A 5 22
A 6 23
A 7 24
A 8 25
D 3 25
D 4 25
D 5 26
A 9 26
A 10 27
A 11 28
A 12 29
A 13 30
D 13 35
D 1 36
D 2 37
D 3 38
D 4 38
D 5 38
D 6 38
D 7 39
D 8 40
D 9 41
D 10 44
D 11 46
D 12 50
D 13 60
D 14 70
E

▶ Tips:
  看到这三行红色的了吗!没错都是车牌13,他出去了两次!!! 所以你不能按照常规来思考。 我原来想,如果这个车不在停车场,然后他离开了,那他可能在便道上啊,那也得让它开走啊!结果我想多了,如果它在便道上你就随他去吧。(下面我的代码已经注释掉了)

样例输出:

汽车1停靠在停车场1号位置
汽车2停靠在停车场2号位置
汽车3停靠在停车场3号位置
汽车4不在停车场
汽车3停车4小时,缴纳停车费20元
汽车4停靠在停车场3号位置
汽车5停靠在停车场4号位置
汽车6停靠在便道的1号位置
汽车7停靠在便道的2号位置
汽车8停靠在便道的3号位置
汽车3不在停车场
汽车4停车4小时,缴纳停车费20元
汽车6停靠在停车场4号位置
汽车5停车4小时,缴纳停车费20元
汽车7停靠在停车场4号位置
汽车9停靠在便道的2号位置
汽车10停靠在便道的3号位置
汽车11停靠在便道的4号位置
汽车12停靠在便道的5号位置
汽车13停靠在便道的6号位置
汽车13不在停车场
汽车1停车26小时,缴纳停车费130元
汽车8停靠在停车场4号位置
汽车2停车22小时,缴纳停车费110元
汽车9停靠在停车场4号位置
汽车3不在停车场
汽车4不在停车场
汽车5不在停车场
汽车6停车13小时,缴纳停车费65元
汽车10停靠在停车场4号位置
汽车7停车13小时,缴纳停车费65元
汽车11停靠在停车场4号位置
汽车8停车4小时,缴纳停车费20元
汽车12停靠在停车场4号位置
汽车9停车4小时,缴纳停车费20元
汽车13停靠在停车场4号位置
汽车10停车6小时,缴纳停车费30元
汽车11停车7小时,缴纳停车费35元
汽车12停车10小时,缴纳停车费50元
汽车13停车19小时,缴纳停车费95元
汽车14不在停车场

提示:
需另设一个栈(也用链表结构实现),临时停放为给要离去的汽车让路而从停车场退出来的汽车。栈中每个元素表示一辆汽车,包含两个数据项:汽车的牌照号码和进入停车场的时刻。
▶ Tips:
  这个是给人家那些按照要求认认真真写的人的提示。


答案1:
我直接偷懒用链表写了……

#include<iostream>
using namespace std;
struct Node
{
    int data;
    int time;
    Node *next;
};
class car
{
public:
    car(){head=new Node; head->next=NULL;}
    ~car(){};
    void in(int m,int n);
    void pop();
    void leave(int m);
    int getlic(int n);
    int gettime(int n);
    int find(int n);
private:
    Node *head;
};
void car::in(int m,int n)
{
    Node *p=head;
    while(p->next!=NULL)
        p=p->next;
    Node *s=new Node;
    s->data=m;
    s->time=n;
    p->next=s;
    s->next=NULL;
}
void car::pop()
{
    Node *p=head->next;
    head->next=p->next;
    delete p;
}
void car::leave(int m)
{
    Node *p=head;
    for (int i=0;i<m-1;i++)
    {
        p=p->next;
    }
    Node *q=p->next;
    p->next=q->next;
    delete q;
}
int car::gettime(int n)
{
    Node *p=head;
    for (int i=0;i<n;i++)
    {
        p=p->next;
    }
    return p->time;
}
int car::getlic(int n)
{
    Node *p=head;
    for (int i=0;i<n;i++)
    {
        p=p->next;
    }
    return p->data;
}
int car::find(int n)
{
    Node *p=head;
    int count=0;
    while(p->next!=NULL)
    {
        count++;
        p=p->next;
        if (p->data==n)
            return count;
    }
    return 0;
}
int main()
{
    car Park,Road;
    int cpark=0,croad=0,capacity,money,time,license;
    cin>>capacity>>money;
    char instruction;
    while(cin>>instruction)
    {
        if(instruction=='E') break;
        cin>>license>>time;
        if (instruction=='A')
        {
            if (cpark<capacity)
            {
                cpark++;
                Park.in(license,time);
                cout<<"汽车"<<license<<"停靠在停车场"<<cpark<<"号位置"<<endl;
            } 
            else
            {
                croad++;
                Road.in(license,time);
                cout<<"汽车"<<license<<"停靠在便道的"<<croad<<"号位置"<<endl;
            }
        } 
        else if(instruction=='D')
        {
            int flag=Park.find(license);
            if(flag==0)
            {
                cout<<"汽车"<<license<<"不在停车场"<<endl;
                /*flag=Road.find(license);
                if (flag!=0)
                {
                    Road.leave(flag);
                }*/
            }
            else
            {
                int result=time-Park.gettime(flag);
                cout<<"汽车"<<license<<"停车"<<result<<"小时,缴纳停车费"<<result*money<<"元"<<endl;
                Park.leave(flag);
                cpark--;
                if (croad>0)
                {
                    croad--;cpark++;
                    Park.in(Road.getlic(1),time);
                    cout<<"汽车"<<Road.getlic(1)<<"停靠在停车场"<<cpark<<"号位置"<<endl;
                    Road.pop();
                }
            }
        }
    }
    return 0;
}


答案2:
恩,这是别人写的,表面上也算个栈与队列……

#include<iostream>
using namespace std;
 
struct data1
{
    int code;
    int T;
};
 
struct queue
{
    data1 a[1000];
    int head;
    int tail;
};
 
struct stack
{
    data1 a[1000];
    int top;
};
 
int main()
{
    char flag;
    int code, T;
    queue q;
    q.head = 1;
    q.tail = 1;
    stack s1;
    s1.top = 0;
    int n, m;
    cin >> n >> m;
    while (cin >> flag)
    {
        if (flag == 'E') break;
        cin >> code >> T;
        if (flag == 'A')
        {
            if (s1.top < n)
            {
                s1.top++;
                s1.a[s1.top].code = code;
                s1.a[s1.top].T = T;
                cout << "汽车" << code << "停靠在停车场" << s1.top << "号位置" << endl;
            }
            else
            {
                q.a[q.tail].code = code;
                q.a[q.tail].T = T;
                cout << "汽车" << code << "停靠在便道的" << q.tail << "号位置" << endl;
                q.tail++;
            }
        }
        else if (flag == 'D')
        {
            int book = 0;
            int i;
            for (i = 1; i <= s1.top; i++)
            {
                if (code == s1.a[i].code)
                {
                    book = 1;
                    break;
                }
            }
            if (book == 0)
            {
                cout << "汽车" << code << "不在停车场" <<endl;
            }
            else
            {
                int t = T - s1.a[i].T;
                for (int j = i; j < s1.top ; j++)
                {
                    s1.a[j].code = s1.a[j + 1].code;
                    s1.a[j].T = s1.a[j + 1].T;
                }
                int cost = m * t;
                cout << "汽车" << code << "停车" << t << "小时,缴纳停车费" << cost << "元" << endl;
                if (q.head < q.tail)
                {
                    s1.a[s1.top].code = q.a[q.head].code;
                    s1.a[s1.top].T = T;
                    q.tail--;
                    for (int j = q.head; j < q.tail; j++)
                    {
                        q.a[j].code = q.a[j + 1].code;
                        q.a[j].T = q.a[j + 1].T;
                    }
                    cout << "汽车" << s1.a[s1.top].code << "停靠在停车场" << s1.top << "号位置" << endl;
                }
                else
                {
                    s1.top--;
                }
            }
        }
    }
    return 0;
}

我是萝莉安。(´;ω;`)我会继续努力成为程序媛的…

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ann's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值