連想のままにし、演算子の優先順位を持たない文字列計算機を作成しています。私の主な問題は、switch ステートメントの私のアルゴリズムが文字列を 1 つの部分文字列に分割し、残りの文字列を別の部分文字列、つまり式の残りの部分に分割していることです。たとえば、10+3*6 は 78 に等しくなければなりませんが、最初に (3*6) を評価してから 10 を加算して 28 の値を与えると、これは正しくありません。文字列式が左から右に評価されるように、この問題を修正する方法はありますか? 前もって感謝します!
#include<iostream>
#include<sstream>
#include<string>
#include<cctype>
#include<cmath>
using namespace std;
enum {PLUS='+',MINUS='-',MULT='*'};
int numberValue(string &expr)
{
istringstream is(expr);
int value = 0;
is >> value;
return value;
}
int expressionValue(string &expr)
{
for(int i = 0;i<expr.length();i++)
{
switch(expr.at(i))
{
case PLUS:
return expressionValue(expr.substr(0,i)) +
expressionValue(expr.substr(i+1,expr.length()-i-1));
case MINUS:
return expressionValue(expr.substr(0,i)) -
expressionValue(expr.substr(i+1,expr.length()-i-1));
case MULT:
return expressionValue(expr.substr(0,i)) *
expressionValue(expr.substr(i+1,expr.length()-i-1));
}
}
return numberValue(expr);
}
int main()
{
string expressionString;
cout << "Enter An expression: " << endl;
cin >> expressionString;
cout << expressionValue(expressionString) << endl;
return 0;
}