中綴表示式轉為逆波蘭表示式

卑以自牧lq發表於2024-10-09

中綴表示式轉為逆波蘭表示式

演算法步驟:

  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;
}

相關文章