C++后缀表达式求值代码如何支持多位数字操作数
后缀表达式多位数支持修改方案
原有代码核心问题
- 每次仅读取单个数字字符压栈,未处理连续数字拼接多位数的场景
- 代码存在逻辑错误:取出
op1后调用stk.top()未执行弹出操作,会导致栈残留元素异常 - 无操作数边界区分规则,没有分隔符的场景下无法判定多位数的起止(比如
213+无法区分是21+3还是2+13),因此约定后缀表达式的操作数、运算符之间用空格分隔,测试用例输入调整为21 3 +
具体修改方案
- 遍历字符串时新增空格跳过逻辑,处理分隔符
- 遇到数字时循环读取后续所有连续数字字符,拼接为完整整数后转换为数值压栈,同时移动遍历下标跳过已处理的数字位
- 修复
op1弹出的逻辑错误
修改后完整代码
#include <iostream> #include <string> #include <stack> #include <cctype> using namespace std; float postix_evalute(string expr) { stack<float> stk; int x = 0; while (x < expr.length()) { // 跳过空格分隔符 if (isspace(expr[x])) { x++; continue; } // 处理多位数 if (isdigit(expr[x])) { float num = 0; // 连续读取所有数字字符拼接为完整数值 while (x < expr.length() && isdigit(expr[x])) { num = num * 10 + (expr[x] - '0'); x++; } stk.push(num); } else { float val; 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; } stk.push(val); x++; } } return stk.top(); } int main() { string line; cout << "请输入以空格分隔的后缀表达式:" << endl; getline(cin, line); // 改用getline读取带空格的输入 cout << postix_evalute(line) << endl; return 0; }
效果验证
输入测试用例21 3 +,输出结果为24,符合预期。如果需要支持小数操作数,只需要在数字处理逻辑中新增小数点的判断和拼接逻辑即可。
内容的提问来源于stack exchange,提问作者golden_hacker
相关产品推荐
相关产品推荐

