2011-01-23 21 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; 

ではなく)マケールベル

答えて

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

0

は、あなたが(pop_backから返された値を見たいと思っていないだろう、ありがとう!

+1

woot!魅力のように動作し、C++は毎年苦痛を軽減しています。再度、感謝します。私がしている比較のための提案、彼らはちょっと長いです。 (入力> = 'A' &&入力<= 'Z'))||入力> = '0' &&入力<= '9')) ((入力> = 'a' &&入力<= 'z')|| ) – Malaken

1

あなたがスタックで作業しているとき、あなたは通常値を見ることができるようにしたいですスタックの上部に配置します。あなたのクラスでは、最初に押されたアイテム(スタックの一番下)が表示されます。あなたのReturnFront()はおそらくWell.back()を返し、おそらくReturnTop()のように呼ばれるべきです。

関連する問題