使用STL的c++:堆栈和队列

C++ using STL: Stack and Queue

本文关键字:堆栈 队列 c++ STL 使用      更新时间:2023-10-16

作业要求:

一天的数据集可以在First Class上的lot.txt文件中找到。

到达/离开代码:字符(A或D)许可证字符串(例如BOSS)表示军事时间的时间整数值

一个早起的人一个工人一个首席执行官一个职员一个经理商务英语900句商务英语900句商务英语900句商务英语900句商务英语900句商务英语900句工人1100 A看门人1100 D经理1130

车辆应该记录为包含许可证和到达时间。为简单起见,时间将是一个整数代表军事时间。包括c++ string类。
struct Vehicle{字符串许可证;//license值int到来;//军用时间(0 - 2359)};

读入数据文件的行并重新创建汽车的运动进出停车场。车辆每小时收费8美元在他们逗留期间。部分小时是四舍五入的。你是否可以假设只有停车场的车主才会离开请求。报告当天所有停在停车场的车以及电荷之和。使用讨论过的模板堆栈和队列类在课堂上。

对于每次处理的到货,您应该报告:许可证为xxxxxx的汽车停在xxxx或牌照为xxxxxx的汽车在xxxx -被拒绝缘分已满!

对于每一个处理的出发,你应该报告:有许可证的汽车XXXXXX于XXXX离开,支付$xx.xx

当汽车离开时,我的零件有麻烦。我不熟悉堆栈和队列,但据我所知,堆栈是后进先出,队列是先进先出。

我有:

    struct Vehicle
    {
        char ad; // Arrival departure char
        string license; // license value
        int arrival; // arrival in military time
    };
    int main()
    {
        ifstream  fin;          // declare input file stream object 
        fin.open ("lot.txt");  //open data text
        stack<string> stack; // STL Stack object
        queue<string> q; // STL Queue object
        Vehicle v; // Object of struct Vehicle
        while(!fin.fail()){
            fin >> v.ad >> v.license >> v.arrival;
            if (v.ad == 'A' && stack.size() < 5){
                stack.push(v.license);
                cout << endl << "Car with license " << v.license << " parked at " << v.arrival;
            }else if(v.ad == 'A' && stack.size() >= 5){
                cout << endl << "Car with license " << v.license << " turned away at " << v.arrival << " - LOT FULL";
            }else if(v.ad == 'D'){
                string departingcar = v.license;
                for(int i=0; i<stack.size(); i++)
//am I on the right track with a for loop?
                    q.push(v.license);
                    stack.pop();
                    q.pop();
                    if(departingcar != v.license){
                        stack.push(v.license);
                    }
                }
            }
        }
        return 0;
    }

我可以读取车辆没有问题,但当我必须从堆栈中删除车辆,将它们放入队列,然后将它们插入堆栈时,我迷路了。

目前你的for循环并没有真正的意义,因为在你向队列中添加了一些东西之后,你也弹出了前面的元素,永远失去了它,因为你从来没有把它保存在其他地方。

我假设你在这里要做的是找到插入到堆栈中的汽车,并将其移除。如果是,那么执行如下操作:

string departingcar = v.license;
//find and remove the license plate from the stack
for(int i=0; i<stack.size(); i++)
{
    if (departingcar != stack.top())
    {
        q.push(stack.top());
        stack.pop();
    }
    else
    {
        stack.pop();
        break;
    }  
 }
 //put the remaining cars back in the stack and empty out the queue
 while(!q.empty())
 {
    stack.push(q.front());
    q.pop();
 }

所以基本上这里发生的是,我们在队列中添加的汽车不等于出发汽车的车牌。如果遇到想要移除的汽车的车牌,则不将其添加到队列中,而是将其从堆栈中移除,并在找到汽车后退出for循环。接下来,简单地清空队列,将之前从堆栈中移出的小车推回到堆栈中。