中缀表达式转为逆波兰表达式
算法步骤:
- 创建一个栈 用于存储运算符。
- 输出序列 用于保存转换后的逆波兰表达式。
- 遍历中缀表达式的每个字符:
- 如果是操作数(单字母变量),直接加入输出序列。
- 如果是左括号 (,则压入栈中。
- 如果是右括号 ),则弹出栈中的运算符并添加到输出序列,直到遇到左括号。
- 如果是运算符(如 +、-、*、/),则:
弹出栈中的运算符到输出序列,直到栈顶运算符的优先级低于当前运算符或栈为空,然后将当前运算符压入栈中。
- 处理完所有字符后,将栈中剩余的运算符弹出到输出序列。
输出结果 为逆波兰表达式。
运算符优先级:
- + 和 - 的优先级最低,值为 1。
- * 和 / 的优先级高于 + 和 -,值为 2。
#include <iostream>
#include <stack>
#include <string>
#include <cctype>
#include <unordered_map>
int precedence(char op) {
if (op == '+' || op == '-') return 1;
if (op == '*' || op == '/') return 2;
return 0;
}
std::string infixToPostfix(const std::string& expression) {
std::stack<char> operators;
std::string output;
for (char token : expression) {
if (std::isalpha(token)) { // 如果是操作数(字母),直接加入输出
output += token;
} else if (token == '(') { // 如果是左括号,压入栈
operators.push(token);
} else if (token == ')') { // 如果是右括号,弹出栈直到遇到左括号
while (!operators.empty() && operators.top() != '(') {
output += operators.top();
operators.pop();
}
operators.pop(); // 弹出左括号
} else if (precedence(token) > 0) { // 如果是运算符
while (!operators.empty() && precedence(operators.top()) >= precedence(token)) {
output += operators.top();
operators.pop();
}
operators.push(token);
}
}
// 弹出剩余的运算符
while (!operators.empty()) {
output += operators.top();
operators.pop();
}
return output;
}
int main() {
std::string postfix = infixToPostfix("a+b*(c-d)");
std::cout << "posfix: " << postfix << std::endl;
return 0;
}
标签:std,中缀,operators,运算符,token,波兰,output,表达式
From: https://www.cnblogs.com/AngleLin/p/18454617