You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 14:06:03