嵌入式Linux C++练习7——栈和队列实现简单的停车场管理系统

题目:

设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。车辆根据到达先后依次从停车场最里面向大门口处停放(最先到达的第一辆车放在停车场的最里面)。如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车就进入停车场。停车场内如有某辆车要开走,在他之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆在依原来的次序进场。编制模拟该停车场的管理的程序。

思路:

最里面的车子想出来,需要先让外面的车子都出去,等该车出去后再依次停进,在停车场外,有一个等待进入停车场的队列,后续的车子都跟在尾巴上,当停车场内有汽车出来时,在队列头的汽车依次停入

一点碎碎念:这次的代码属于想到哪写到哪的那种,比较凌乱,以后有时间会重新梳理一遍

#include <iostream>
#include <string>
#include <stack>
#include <queue>
using namespace std;

#define name_max 20
#define stack_max 3 //停车场容量

class mystack
{
public:
    void mypush(string name);
    void mypop();
    int mysize();
    string mytop();
    int stackfull = -1; //-1为空,0为不满,1为满

protected:
    string name[name_max];
    int top;
    stack<string> stk;
};

int mystack::mysize()
{
    return stk.size();
}

string mystack::mytop()
{
    return stk.top();
}

void mystack::mypush(string name)
{
    stackfull = 0;
    stk.push(name);

    if (stk.size() == stack_max)
    {
        stackfull = 1;
    }
}

void mystack::mypop()
{
    stk.pop();

    if (stk.size() == 0)
    {
        stackfull = -1;
    }
}

class myqueue
{
public:
    void mypush(string name);
    string mypop();
    bool queuefull = 0; //车道上是否有车,有为1,无为0

private:
    string name[name_max];
    queue<string> q;
};

void myqueue::mypush(string name)
{
    q.push(name);
    queuefull = 1;
}

string myqueue::mypop()
{
    string head = q.front();
    q.pop();
    if (q.size() <= 0)
    {
        queuefull = 0;
    }
    return head;
}

class carstop
{
public:
    void pushsk(string name);
    void pushqueue(string name);

    void popsk(int temp); //stack temp;
    void popqueue();

    void displaystack(); //显示停车场里的车流信息
    void displayqueue(); //显示路边的车流信息

private:
    myqueue q;
    mystack sk;
};

void carstop::pushsk(string name)
{
    if (sk.stackfull != 1)
    {
        sk.mypush(name);
    }
    else
    {
        pushqueue(name);
    }
}

void carstop::pushqueue(string name)
{
    q.mypush(name);
}

void carstop::popsk(int temp)
{
    stack<string> sk_copy; //辅助栈

    // if (sk.stackfull = -1)
    // {
    //     cout << "当前停车场里没有车!" << endl;
    //     return;
    // }

    for (int i = 0; i <= (sk.mysize() - temp); i++)
    {
        sk_copy.push(sk.mytop());
        sk.mypop();
    }
    cout << sk.mytop() << "离开!" << endl;
    sk.mypop();

    while (sk_copy.size() > 0)
    {
        sk.mypush(sk_copy.top());
        // cout << sk_copy.top() << endl;
        sk_copy.pop();
    }

    sk.stackfull = 0; //车辆离开,停车场有空位
}

void carstop::popqueue()
{
    sk.mypush(q.mypop());
}

void carstop::displaystack()
{
    stack<string> stk_copy;

    if (sk.stackfull == -1)
    {
        cout << "当前停车场里没有车!" << endl;
    }

    else if (sk.stackfull >= 0)
    {
        while (sk.stackfull != -1)
        {
            stk_copy.push(sk.mytop());
            // cout << stk_copy.top() << endl;
            sk.mypop();
        }

        cout << "当前停车场里有车:" << endl;

        while (stk_copy.size() > 0)
        {
            sk.mypush(stk_copy.top());
            cout << stk_copy.top() << endl;
            stk_copy.pop();
        }
    }
}

void carstop::displayqueue()
{
    if (q.queuefull == 0)
    {
        cout << "当前没有汽车等待!" << endl;
    }
    else
    {
        cout << "目前等待的车有:" << endl;
        queue<string> q_copy;

        while (q.queuefull == 1)
        {
            string data = q.mypop();
            cout << data << " " << endl;
            q_copy.push(data);
        }

        while (q_copy.size() != 0)
        {
            q.mypush(q_copy.front());
            q_copy.pop();
        }
    }
}

int main()
{
    carstop park;

    park.pushsk("苏A1111");
    park.pushsk("苏A1112");
    park.pushsk("苏A1113");
    park.pushsk("苏A1114");
    park.pushsk("苏A1115");
    park.pushsk("苏A1116");
    park.pushsk("苏A1117");

    park.displaystack();
    park.displayqueue();

    park.popsk(1);
    park.popqueue();

    park.displaystack();
    park.displayqueue();

    park.popsk(3);
    park.popqueue();

    park.displaystack();
    park.displayqueue();

    return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。车辆按到达停车场时间的早晚依次从停车场最里向大门口处停放(最先到达的第一辆车放在停车场的最里面)。如果停车场已放满n辆车,则后来的车只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车就进入停车场停车场内如有某辆车要开走,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆次序。编制一程序模拟该停车场的管理。(2) 实现要求:要求程序输出每辆车到达后的停车位置(停车场或便道上),以及某辆车离开停车场时应交纳的费用和它在停车场内停留的时间。(2) 实现提示:汽车的模拟输入信息格式可以是:(到达/离去,汽车牌照号码,到达/离去的时刻)。例如,(’A’,1,5)表示1号牌照车在5时刻到达,而(’D’,5,20)表示5号牌照车在20时刻离去。整个程序可以在输入信息为(’E’,0,0)时结束。本题可用顺序存储结构和链式存储结构来实现。本人的一个数据结构课程设计(用C++源码实现,供大家学习参考之用,有不妥之处望指正)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值