C ++使用STL:堆栈和队列

时间:2011-11-13 20:44:16

标签: c++ stl stack queue

我的作业要求:

  
    

First Class的文件lot.txt中提供了一天的数据集。

  
     

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

     

EARLYBIRD 630 A WORKER 700 A CEO 730 A CLERK 730 A MANAGER 800 A   VP 900 D CLERK 930 A SHOPPER 1000 D CEO 1000 D EARLYBIRD 1030 D.   工人1100 A JANITOR 1100 D MANAGER 1130

     

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

     

阅读数据文件的行并重新创建汽车的移动   进出停车场。车辆每小时收费8.00美元   在他们逗留期间。部分时间被四舍五入。您   可以假设只有该车的车主才能在出发时到达   请求。报告当天在该地段留下的所有车辆以及   收费总和。使用讨论的模板堆栈和队列类   在演讲中。

     

对于每次到达的处理,您应报告:车牌号为xxxxxx   停在xxxx或有许可证xxxxxx的汽车在xxxx被拒之门外 -   很多!

     

对于每次处理的出发,您应报告:带有许可证的车辆   xxxxxx离开xxxx支付$ xx.xx

当汽车离开时,我遇到了麻烦。我不熟悉堆栈和队列,但据我所知,堆栈是LIFO,队列是FIFO。

这就是我所拥有的:

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

我可以毫无问题地阅读车辆,但是当我必须从车厢中取出车辆时,将它们放入队列中,然后将它们插回堆叠中,我迷路了。

1 个答案:

答案 0 :(得分:1)

目前你的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-loop。接下来,我们简单地清空队列,将之前从堆栈中移除的汽车推回堆栈。