2011-11-13 86 views
0

我的功課問:C++ STL使用:棧和隊列

一天的數據集是在頭等艙文件lot.txt可用。

到達/離開代碼:CHAR(A或d)許可證字符串(EX BOSS) 時間整數值表示軍用時間

一個Earlybird的630工人700一位CEO 730店員730經理800甲 VP 900 d祕書930購物者1000 d CEO 1000 d晨鳥1030 d WORKER 1100看門1100 d MANAGER 1130

的車輛應記錄爲包含許可證和 的到達時間的結構。爲了簡單起見,時間將是代表軍事時間的整數 。包括C++字符串類。
struct Vehicle {string license; //許可值int 到達; //抵達軍事時間(0 - 2359)};

閱讀數據文件的行,並重新創建汽車 進出停車場的運動。車輛在入住期間每小時收費8美元,費用爲 。部分時間被四捨五入。您 可以假設只有在該地段的汽車的業主抵達時出發 請求。在日期結束時報告該地段剩餘的所有車輛以及費用總和。在講座中使用討論 的模板堆棧和隊列類。

對於每次到達處理您應該報告:車輛停放在xxxx許可證xxxxxx 或許可證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; 
    } 

我可以在沒有問題的閱讀車輛,但是當我從堆棧中移走車輛,把它們放在一個隊列裏,然後將其插入回堆疊,我迷路了。

+0

你的教授真的使用像'lol.txt'這樣的名字嗎? –

+0

應該是'lot.txt' – Nick

回答

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。接下來,我們只需將隊列清空,將我們之前從堆棧中移出的汽車推回堆棧。

+0

謝謝!這清除了我遇到的麻煩。 – Nick