2011-01-23 58 views
2

這是前一個線程,我在這個實驗室得到了幫助。我的堆棧行爲異常,至少可以說,當我添加一個項目到堆棧,稍後打印出來時,它看起來似乎沒有添加正確。如果我輸入另一個操作數(*,/,+),我總是打印出加號(+)。C++堆棧實現(不能正常工作)

我正在使用堆棧將用戶輸入,中綴表達式轉換爲後綴。它似乎工作正常,除了打印結束時在堆棧中的操作數。

#include <iostream>; 
#include <vector> 
using namespace std; 

class DishWell{ 
public: 
    char ReturnFront(){ 
     return Well.front(); 
    } 
    void Push(char x){ 
     Well.push_back(x); 
    } 
    void Pop(){ 
     Well.pop_back(); 
    } 
    bool IsEmpty(){ 
     return Well.empty(); 
    } 
private: 
    vector<char> Well; 
}; 

bool Precidence(char Input, char Stack){ 
    int InputPrecidence,StackPrecidence; 
    switch (Input){ 
     case '*': 
      InputPrecidence = 4; 
      break; 
     case '/': 
      InputPrecidence = 4; 
      break; 
     case '+': 
      InputPrecidence = 3; 
      break; 
     case '-': 
      InputPrecidence = 3; 
      break; 
     case '(': 
      InputPrecidence = 2; 
      break; 
     default: 
      InputPrecidence = 0; 
    } 
switch (Stack){ 
    case '*': 
     StackPrecidence = 4; 
     break; 
    case '/': 
     StackPrecidence = 4; 
     break; 
    case '+': 
     StackPrecidence = 3; 
     break; 
    case '-': 
     StackPrecidence = 3; 
     break; 
    case '(': 
     StackPrecidence = 2; 
     break; 
    default: 
     StackPrecidence = 0; 
} 
if(InputPrecidence>StackPrecidence) return true; 
else return false; 
} 

int main(int argc, char** argv) { 
    DishWell DishTray; 
    char Input; 
    bool InputFlag; 
    InputFlag = true; 
    cout<<"Enter Input, invalid input will terminate"<<endl; 
    while(InputFlag){ 
     cout<<"Input: "; 
     cin>>Input; 
     cout<<endl; 
     if((((Input>='a'&&Input<='z')||(Input>='A'&&Input<='Z'))||Input>='0'&&Input<='9')))//If Digit or Number 
      cout<<Input; 
     if((Input=='*'||Input=='/'||Input=='+'||Input=='-')){//if operand 
      if(DishTray.IsEmpty()) 
       DishTray.Push(Input); 
      else if(Precidence(Input,DishTray.ReturnFront())) 
       DishTray.Push(Input); 
      else if(!Precidence(Input,DishTray.ReturnFront())) 
       cout<<"Output: "<<Input<<endl; 
     } 
     else if(!((((Input>='a'&&Input<='z')||(Input>='A'&&Input<='Z'))||(Input>='0'&&Input<='9')))||((Input=='*'||Input=='/'||Input=='+'||Input=='-')))//if not digit/numer or operand 
      InputFlag = false; 
    } 
    int counter = 0; 
    while(!DishTray.IsEmpty()){ 
     counter++; 
     cout<<counter<<" Element "<<DishTray.ReturnFront()<<endl; 
     DishTray.Pop(); 
    } 
    return 0; 

謝謝MACAIRE貝爾

回答

1

您的循環調用front(),但後來調用pop_back()。這將始終返回矢量中的第一個元素,直到所有元素都彈出爲止,因爲您永遠不會擦除前一個元素。你ReturnFront()方法也許應該是:

char ReturnBack(){ 
    return Well.back(); 
} 

然後你的循環結尾:

while(!DishTray.IsEmpty()){ 
     counter++; 
     cout<<counter<<" Element "<<DishTray.ReturnBack()<<endl; // will return last element 
     DishTray.Pop(); // actually pop the element printed 
    } 
+0

啊我明白了,我其實已經回到了前一篇文章。認爲我的邏輯錯了,我回來/前/第一/最後困惑。我應該改變我所有的前臺功能,使其恢復正確嗎? – Malaken 2011-01-23 02:23:42

0

難道你不希望看到pop_back返回的值(),而不是放棄,如果它是你目前在做什麼?

+1

woot!像魅力一樣工作,C++每年都變得不那麼痛苦。再次感謝。任何關於我所做比較的建議,他們都有點兒冗長。 (((Input> ='a'&& Input <='z')||(Input> ='A'&& Input <='Z'))|| Input> ='0'&& Input <='9')) ) – Malaken 2011-01-23 02:36:49

1

當你用棧工作,你通常希望能夠看到價值在堆棧的頂部。您的課程只允許推送的第一個項目(即堆棧的底部)可見。你的ReturnFront()應該可能返回Well.back(),也許它應該被稱爲類似ReturnTop()。