中綴表示式轉為逆波蘭表示式
演算法步驟:
- 建立一個棧 用於儲存運算子。
- 輸出序列 用於儲存轉換後的逆波蘭表示式。
- 遍歷中綴表示式的每個字元:
- 如果是運算元(單字母變數),直接加入輸出序列。
- 如果是左括號 (,則壓入棧中。
- 如果是右括號 ),則彈出棧中的運算子並新增到輸出序列,直到遇到左括號。
- 如果是運算子(如 +、-、*、/),則:
彈出棧中的運算子到輸出序列,直到棧頂運算子的優先順序低於當前運算子或棧為空,然後將當前運算子壓入棧中。
- 處理完所有字元後,將棧中剩餘的運算子彈出到輸出序列。
輸出結果 為逆波蘭表示式。
運算子優先順序:
- + 和 - 的優先順序最低,值為 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;
}