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
相关产品推荐
相关产品推荐

