0

私がやろうとしているのは、"((4+2)/2)" などの文字列を取得し、それを評価して 3 を返すことです。左括弧 '('、1 つは数字 '0' から '9' 用、もう 1 つは演算子 '+' '-' '*' '/' および '%' 用です。

私が抱えている問題は、実際に文字列をスタックに分離することです。私のコードは次のとおりです。

//The evaluate function takes a string containing an arithmetic expression,
//evaluates it,and returns its result
int evaluate(string exp)
 {
 stack<char> parStack;
 stack<int> numStack;
 stack<char> opStack;

 int j = exp.size();
 int i=0;
 char x;

 //for (i=0; i<j; i++)
 //{
 while (i<j)
 {
     if(exp[i] = '(')
     {
         parStack.push(exp[i]);
         cout << exp[i] << endl;  // just to see what is being pushed
     }
     if((exp[i]='0') || (exp[i]='1') || (exp[i]='2') || (exp[i]='3') || (exp[i]='4') || (exp[i]='5') || (exp[i]='6') || (exp[i]='7') || (exp[i]='8') || (exp[i]='9'))  // I feel this is terribly inefficient
     {
         numStack.push(exp[i]);
     }
     if((exp[i] = '+') || (exp[i] = '-') || (exp[i] = '*') || (exp[i] = '/') || (exp[i] = '%'))
     {
         opStack.push(exp[i]);
     }
     i++;
 }
 //}  // end for

 return -1;

 }  // end evaluate

ご覧のとおり、for ループと while ループの両方でこれに取り組んでみましたが、どちらも同じ結果になりました。どういうわけか、「(5+3)」と入力すると、プッシュされているものとして「(((((」が出力されます。if ステートメントがこのように繰り返されるのはなぜですか?ここでは return を無視します。スタックを効果的に作成できるようになると、文字列を実際に評価するために完了するため、最後に -1 を付けます。

4

3 に答える 3

4

if ステートメントで 2 つの「=」を使用する必要があります

if(exp[i] = '(')  //wrong (your code)
if(exp[i] == '(') //right
于 2012-10-31T01:21:12.013 に答える
3

== 演算子の代わりに = 演算子を使用しました。コードが実行されると、'(' の ascii 値が if 条件でチェックインされ、文字列にも割り当てられます。それを == に変更するだけで、コードは正常に動作します....

于 2012-10-31T01:21:06.417 に答える
1

また、実用的な目的のために、次のように文字列検索を使用するように if 条件を変更することもできます。

const char OPEN_PARAN = '(';
const string digits = "0123456789";
const string operators = "*-+%";


//...
while(i < j){
  if(exp[i] == OPEN_PARAN){ ... }
  else if(digits.find(exp[i]) != string::npos){ ... }
  else if(operators.find(exp[i]) != string::npos){ ... }
  else{ ... }
}
于 2012-10-31T01:56:34.817 に答える