0
#include <iostream>
#include <string>
#include <stack>
#include <sstream>

using namespace std;

stack<int>aStack;
stack<int>operand1;
stack<int>operand2;
stringstream postfix;

stringstream &postfixExp(string ch)
{
  for(int i =0; i< ch.length(); i++)
  {
      if(ch[i] == '1' || ch[i] == '2' || ch[i] == '3' || ch[i] == '4' || ch[i] == '5' || ch[i] == '6' || ch[i] == '7' || ch[i] == '8' || ch[i] == '9' || ch[i] == '0' )
      {
          aStack.push(ch[i]);
      }

      else if(ch[i] == '+')
      {
        operand1.push(aStack.top());
        aStack.pop();

        operand2.push(aStack.top());
        aStack.pop();

        int x = operand1.top() - 48;
        int y = operand2.top() - 48;
        int result = x + y;

        aStack.push(result);
      }

      else if(ch[i] == '*')
      {
        operand1.push(aStack.top());
        aStack.pop();

        operand2.push(aStack.top());
        aStack.pop();

        int x = operand1.top() - 48;
        int y = operand2.top() - 48;
        int result = x * y;

        aStack.push(result);
      }
  }


  postfix << aStack.top();
  return postfix;

}


int main()
{
  string postfix = "32+2*";

  stringstream * result = &postfixExp(postfix);
  cout << result-> str() ;

  return 0;
}

こんにちは、上記のコードの何が問題なのか知っている人はいますか? 私のプログラムは、後置表記の値を返す必要があります。後置表記として「32+2*」と入力したところ、10 が返されるはずです。どうやら問題が発生しているようで、代わりに -86 が返されます。

エラーはこの特定のコードから発生していると思います

else if(ch[i] == '*')
      {
        operand1.push(aStack.top());
        aStack.pop();

        operand2.push(aStack.top());
        aStack.pop();

        int x = operand1.top() - 48;
        int y = operand2.top() - 48;
        int result = x * y;

        aStack.push(result);
      }

そこから、operand2 を表示すると、7 ではなく -43 が表示されます (前の加算 "34+" から派生)。

どの部分が間違っているか教えてください。オペランド 2 の値が 7 でないのはなぜですか。

ありがとうございました

4

3 に答える 3

2
  if(ch[i] == '1' || ch[i] == '2' || ch[i] == '3' || ch[i] == '4' || ch[i] == '5' || ch[i] == '6' || ch[i] == '7' || ch[i] == '8' || ch[i] == '9' || ch[i] == '0' )
  {
      aStack.push(ch[i]);
  }

これは次のようになります。

  if(ch[i] == '1' || ch[i] == '2' || ch[i] == '3' || ch[i] == '4' || ch[i] == '5' || ch[i] == '6' || ch[i] == '7' || ch[i] == '8' || ch[i] == '9' || ch[i] == '0' )
  {
      aStack.push(ch[i] - '0');
  }

- 48他の は壊れているので取り除きます。

于 2013-09-24T03:23:32.100 に答える
2

文字をスタックにプッシュする前に、文字を int に変換します。あなたのコンパイラはそれについてあなたに警告すべきだったようです。警告レベルを上げてみてください。

aStack.push(ch[i]);

になる

aStack.push(ch[i] - '0'); // '0' is 48

各桁を手動で比較するのではなく、isdigitfromを使用できることにも注意してください。<cctype>ch[i]

于 2013-09-24T03:13:13.860 に答える
0

問題は次のとおりです

  else if(ch[i] == '+')
  {
    operand1.push(aStack.top());
    aStack.pop();

    operand2.push(aStack.top());
    aStack.pop();

    int x = operand1.top() - 48;
    int y = operand2.top() - 48;
    int result = x + y;

    aStack.push(result + 48);
   }

これで 10 になります。2 番目の aStack.push(result) も変更する必要があります。

于 2013-09-24T03:14:43.153 に答える