stack<int> s;
int main() {
string exp;
cout << "Enter postfix expression: ";
getline(cin, exp);
int calc = evaluatePosfix(exp);
cout << calc << endl;
}
int evaluatePosfix(string exp) {
for (int i = 0; i < exp.length(); i++) {
if (exp[i] == ' ' || exp[i] == ',') {
continue;
}
if (isNum(exp[i])){
int operand = 0;
while(i < exp.length() && isNum(exp[i])) {
operand = (operand*10) + (exp[i] - '0');
i++;
}
i--;
cout << operand << "&&" << endl;
s.push(operand);
}
else if(isOperator(exp[i])) {
int operand2 = s.top(); s.pop();
int operand1 = s.top(); s.pop();
int result = performOperation(operand1, operand2, exp[i]);
s.push(result);
}
//cout << s.top() << " $$$" << endl;
}
return s.top();
}
bool isOperator(char c) {
if (c == '+' || c == '-' || c == '*' || c == '/') {
return true;
}
return false;
}
bool isNum(char c) {
if (c >= '0' || c <= '9') {
return true;
}
return false;
}
int performOperation(int operand1, int operand2, char operation) {
if (operation == '+') {
return operand1 + operand2;
}
else if (operation == '-') {
return operand1 + operand2;
}
else if (operation == '*') {
return operand1 * operand2;
}
else if (operation == '/') {
return operand1 / operand2;
}
else {
cout << "Error" << endl;
return -1;
}
}
修复后的评估不正确。当我输入22+时,它返回215而不是4。当程序检测到一个运算符时,它应该弹出堆栈中的2个元素,但是由于某种原因,它不会这样做。调用performOperation时,不会发生该操作,因此不会将任何内容压入堆栈。
最佳答案
如果应该将22+
评估为4
,则本节是罪魁祸首:
while(i < exp.length() && isNum(exp[i])) {
operand = (operand*10) + (exp[i] - '0');
i++;
}
您的代码被编写为处理大于10的数字,但是您的示例建议您仅支持一位数字。