C ++ с использованием STL: стек и очередь - PullRequest
0 голосов
/ 14 ноября 2011

Моя домашняя работа спрашивает:

Набор данных за один день доступен в файле lot.txt для первого класса.

Код прибытия / отъезда: char (A или D) Строка лицензии (например, BOSS) Целочисленное значение времени, представляющее военное время

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

Транспортное средство должно быть записано в виде структуры, содержащей лицензию и время прибытия.Для простоты время будет целым числом, представляющим военное время.Включите строковый класс C ++.
struct Vehicle {string license;// значение лицензии int прибытие;// прибытие в военное время (0 - 2359)};

Чтение в строках файлов данных и воссоздание движения автомобилей на парковке и с нее.Транспортные средства взимается $ 8,00 в час в течение всего срока их пребывания.Частичные часы округляются.Вы можете предположить, что только владельцы автомобилей в лоте прибывают с запросом на отъезд.Сообщите о любых автомобилях, оставшихся на участке в конце дня, а также о сумме сборов.Используйте шаблонный стек и классы очереди, обсужденные в лекции.

Для каждого обработанного прибытия вы должны сообщать: Автомобиль с лицензией xxxxxx, припаркованный на xxxx, или Автомобиль с лицензией xxxxxx был отклонен на xxxx - LOT IS FULL!

Для каждого обработанного отъезда вы должны сообщать:Автомобиль с лицензией 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 Ответ

1 голос
/ 14 ноября 2011

В настоящее время ваш цикл 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, поскольку нашли наш автомобиль.Затем мы просто опустошаем очередь, выталкивая машины, которые ранее вынули из стека, обратно в стек.

...