中缀表达式转为逆波兰表达式

中缀表达式转为逆波兰表达式

算法步骤:

  1. 创建一个栈 用于存储运算符。
  2. 输出序列 用于保存转换后的逆波兰表达式。
  3. 遍历中缀表达式的每个字符:
    • 如果是操作数(单字母变量),直接加入输出序列。
    • 如果是左括号 (,则压入栈中。
    • 如果是右括号 ),则弹出栈中的运算符并添加到输出序列,直到遇到左括号。
    • 如果是运算符(如 +、-、*、/),则:
        弹出栈中的运算符到输出序列,直到栈顶运算符的优先级低于当前运算符或栈为空,然后将当前运算符压入栈中。
  4. 处理完所有字符后,将栈中剩余的运算符弹出到输出序列。
    输出结果 为逆波兰表达式。

运算符优先级:

  • + 和 - 的优先级最低,值为 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;
}

posted @ 2024-10-09 16:51  卑以自牧lq  阅读(15)  评论(0编辑  收藏  举报