C++实现后缀表达式求值代码输出错误结果问题求解
后缀表达式求值代码错误分析
核心错误(直接导致输出异常)
- 操作数取值逻辑错误:遇到运算符时,代码直接将当前运算符字符的ASCII值赋值给
op2和op1,完全没有使用栈中存储的操作数。例如+的ASCII值为43,输入32+时实际执行的是43+43=86,和你遇到的错误输出完全吻合。 - 栈操作逻辑错误:
stk.pop()执行后没有将弹出的栈顶值赋值给op2;stk.top()仅读取栈顶值但没有赋值给op1,栈中存储的3、2等有效数值完全没有参与计算。
其他可优化问题
- 操作数顺序需要注意:后缀表达式计算规则为先弹出的是右操作数,后弹出的是左操作数,减法、除法的顺序写反会导致逻辑错误。
- 拼写错误:函数名
postix_evalute、输出字符串中的experssion均存在拼写错误,可按需修正。 - 缺少异常校验:没有判断栈元素数量是否足够、除零错误、非法字符输入等异常场景,代码健壮性不足。
修复后的完整代码
#include <iostream> #include <string> #include <stack> #include <cctype> using namespace std; float postfix_evaluate(string expr) { stack<float> stk; float val; for (int x = 0; x < expr.length(); x++) { // 转为unsigned char避免isdigit传入负值出现未定义行为 if (isdigit((unsigned char)expr[x])) { stk.push((expr[x] - '0')); } else { // 先弹右操作数,再弹左操作数 float op2 = stk.top(); stk.pop(); float op1 = stk.top(); stk.pop(); switch (expr[x]) { case '+': val = op1 + op2; break; case '-': val = op1 - op2; break; case '*': val = op1 * op2; break; case '/': // 可自行添加除零错误判断逻辑 val = op1 / op2; break; default: cout << "存在非法运算符" << endl; return 0; } stk.push(val); } } return stk.top(); } int main() { string line; cout << "请输入后缀表达式:" << endl; cin >> line; cout << "表达式计算结果为:" << postfix_evaluate(line) << endl; return 0; }
内容的提问来源于stack exchange,提问作者golden_hacker
相关产品推荐
相关产品推荐

