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

C++实现中缀转后缀表达式遇问题,求代码修正方案

排查中缀转后缀表达式代码的问题及修正方案

我帮你梳理了代码里的几个核心问题,咱们一个个拆解并修复:

1. 运算符优先级判断完全颠倒

你的checks函数把优先级搞反了!正常的运算符优先级是:^(最高)> *// > +/-(最低)。但你现在的返回值是^=1,+/-=2,*/=3——这会导致优先级高的运算符被错误地压在栈底,转换结果完全错误。

修正后的checks函数:

int checks(char c) {
    if (c == '^') {
        return 3; // 幂运算优先级最高
    } else if (c == '*' || c == '/') {
        return 2;
    } else if (c == '+' || c == '-') {
        return 1;
    } else {
        return -1; // 非运算符返回-1
    }
}

2. 处理运算符时缺少循环判断

当遇到运算符时,你只用了if判断一次栈顶优先级,但实际上栈中可能有多个优先级大于等于当前运算符的元素,需要全部弹出到结果字符串中,之后才能把当前运算符压栈。只用if只会处理一个元素,剩余的高优先级运算符会留在栈里,导致结果混乱。

3. 栈为空时访问stack.top()会崩溃

如果输入的第一个字符是运算符(比如+123),或者栈已经空了还去访问stack.top(),会触发未定义行为(程序崩溃)。所以在比较优先级前,必须先判断栈是否为空,或者栈顶是否是(((的优先级视为最低,遇到它直接压栈即可)。

4. 变量名与STL容器重名

你定义了stack <char> stack;,但stack是C++标准库的容器类名,这种命名会引发歧义,编译器可能报错或出现奇怪的行为,建议改为op_stack这类不会冲突的名字。


完整修正后的代码

#include <bits/stdc++.h>
using namespace std;

int checks(char c) {
    if (c == '^') {
        return 3;
    } else if (c == '*' || c == '/') {
        return 2;
    } else if (c == '+' || c == '-') {
        return 1;
    } else {
        return -1;
    }
}

int main() {
    stack<char> op_stack; // 重命名避免和STL冲突
    string result, input;
    cout << "Enter your equation: ";
    cin >> input;

    for (int i = 0; i < input.length(); i++) {
        if (input[i] == '(') {
            op_stack.push(input[i]);
        } else if (isalnum(input[i])) {
            result += input[i];
        } else if (input[i] == ')') {
            // 弹出直到遇到左括号
            while (!op_stack.empty() && op_stack.top() != '(') {
                char c = op_stack.top();
                op_stack.pop();
                result += c;
            }
            // 弹出左括号本身
            if (!op_stack.empty() && op_stack.top() == '(') {
                op_stack.pop();
            }
        } else {
            // 循环弹出所有优先级 >= 当前运算符的元素
            while (!op_stack.empty() && checks(op_stack.top()) >= checks(input[i])) {
                // 注意:左括号优先级视为最低,遇到就停止弹出
                if (op_stack.top() == '(') {
                    break;
                }
                char c = op_stack.top();
                op_stack.pop();
                result += c;
            }
            op_stack.push(input[i]);
        }
    }

    // 弹出栈中剩余的运算符
    while (!op_stack.empty()) {
        char c = op_stack.top();
        op_stack.pop();
        // 过滤掉可能残留的括号(正常输入下不会有,但做个防护)
        if (c != '(' && c != ')') {
            result += c;
        }
    }

    cout << "Result is: " << result << endl;
    return 0;
}

测试示例

输入:a+b*(c^d-e)^(f+g*h)-i
输出:abcd^e-fgh*+^*+i-(符合正确的后缀表达式结果)

内容的提问来源于stack exchange,提问作者Novelcie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 15:32:30