表达式转换
中->后
- 初始化一个空栈,用于存储运算符。
- 逐个扫描中缀表达式的字符:
- 如果是操作数,直接加入后缀表达式。
- 如果是左括号
(,将其压入栈。 - 如果是右括号
),不断弹出栈顶元素并加入后缀表达式。 - 如果是操作符:
- 如果栈为空或者栈顶为左括号,直接压入栈。
- 否则,比较栈顶操作符和当前操作符的优先级:
- 若当前操作符优先级较高,直接压入栈。
- 若当前操作符优先级较低或相等,弹出栈顶元素并加入后缀表达式。
重复执行直到可以压入栈中。
- 扫描完毕后,将栈中剩余的元素依次加入后缀表达式。
std::string change(const std::string &str) { // 中缀表达式->后缀表达式
std::vector<char> op;
std::string res;
for (auto ch : str) {
if (isdigit(ch)) { // 数字,直接加入
res.push_back(ch);
} else if (ch == '(') {
op.push_back(ch);
} else if (ch == ')') { // 右括号,弹出符号直至左括号
while (op.back() != '(') res.push_back(op.back()), op.pop_back();
op.pop_back(); // 弹出左括号
} else {
if (op.empty() || op.back() == '(') op.push_back(ch);
else {
while (!op.empty() && impt(ch) <= impt(op.back()))
res.push_back(op.back()), op.pop_back();
op.push_back(ch);
}
}
}
while (!op.empty()) res.push_back(op.back()), op.pop_back();
return res;
}
其中 impt 为返回一个操作符的重要性的函数,如果是左括号则返回 \(-\infty\)。

浙公网安备 33010602011771号