轉換步驟
-
初始化兩個棧:
運算符棧s1
和操作數棧s2
; -
從左到右掃描
中綴表達式
; -
遇到
操作數
時,將其壓入棧s2
; -
遇到
運算符
時,比較其與s1棧頂運算符
的優先級:(1)若
s1
為空,或棧頂運算符為左括號(
,則直接將此運算符入棧;(2)否則,若其優先級比棧頂運算符的高,將此運算符壓入
s1
;(3)否則,將
s1
棧頂的運算符彈出並壓入s2
,再次跳轉到步驟(4.1)
與s1中新的棧頂運算符
進行比較; -
遇到
括號
時;(1)若為左括號
(
,則直接壓入s1
;(2)若爲右括號
)
,則依次彈出s1
棧頂的運算符,並壓入s2
,直到遇到左括號爲止。此時將這對括號丟棄; -
重複
步驟2-5
,直至表達式的最右邊
; -
將
s1
中剩餘的運算符依次彈出,並壓入s2
; -
依次彈出
s2
中所有元素並輸出,所得結果的逆序
即爲對應的後綴表達式。
示例
Github開源項目鏈接地址:PostfixExpression
中綴表達式(初始):1+((2+3)*4)-5
後綴表達式(轉換結果):1 2 3 + 4 * + 5 -
源代碼
#include <iostream>
#include <algorithm>
#include <stack>
#include <map>
using namespace std;
stack<char> operSta, numSta;
map<char, int> operMap;
void init();
void trimSpace(string &str);
void scan(const char c);
void inputNum(const char c);
void inputOper(const char c);
void sweep();
void showStack(stack<char> &sta);
int main()
{
init();
// Get a string
string midfixStr;
cout << "Enter a midfix string: ";
cin >> midfixStr;
// Trim spaces
trimSpace(midfixStr);
// Convert midfix to postfix
for (int i = 0, len = midfixStr.length(); i < len; ++i)
{
char tmp = midfixStr.at(i);
scan(tmp);
}
// Do last things
sweep();
// Show result
showStack(numSta);
}
void init()
{
operMap.insert(make_pair('(', 10));
operMap.insert(make_pair(')', 0));
operMap.insert(make_pair('+', 2));
operMap.insert(make_pair('-', 2));
operMap.insert(make_pair('*', 4));
operMap.insert(make_pair('/', 4));
}
void trimSpace(string &str)
{
auto itor = remove_if(str.begin(), str.end(), ::isspace);
str.erase(itor, str.end());
}
void scan(const char c)
{
if (c >= '0' && c <= '9') inputNum(c);
else if (c == '(' || c == ')' || c == '+' || c == '-' || c == '*' || c == '/') inputOper(c);
else
{
cout << "Find invalid character, can not parse!" << endl;
exit(-1);
}
}
void inputNum(const char c)
{
numSta.push(c);
}
void inputOper(const char c)
{
// Check if the underlying container has no elements
if (operSta.empty())
{
operSta.push(c);
return;
}
// Has elements
char topC = operSta.top();
int priNew = operMap.at(c);
int priTop = operMap.at(topC);
// Is '(' or the priority is higher than the top element
if (priNew > priTop || topC == '(' || c == '(')
{
operSta.push(c);
return;
}
// If the input element is ')'
if (c == ')')
{
char tmp;
while ((tmp = operSta.top()) != '(')
{
operSta.pop();
numSta.push(tmp);
}
operSta.pop();
return;
}
// If the priority is lower than the top element
operSta.pop();
numSta.push(topC);
// Recursive
inputOper(c);
}
void sweep()
{
while (!operSta.empty())
{
char tmp = operSta.top();
operSta.pop();
numSta.push(tmp);
}
}
void showStack(stack<char> &sta)
{
stack<char> tmpSta;
while (!sta.empty())
{
char c = sta.top();
sta.pop();
tmpSta.push(c);
}
// Reverse
while (!tmpSta.empty())
{
char c = tmpSta.top();
tmpSta.pop();
sta.push(c);
cout << c << " ";
}
cout << endl;
}
程序效果截圖