中綴表示式轉字首表示式 c++
/**
北理2013年第三題
2018-8-15 13:42
輸入表示式,輸出相應二叉樹的前序遍歷結果
例如輸入:a+b*(c-d)-e/f
輸出:-+a*b-cd/ef
用兩個棧實現,
(1) 初始化兩個棧:運算子棧S1和儲存中間結果的棧S2;
(2) 從右至左掃描中綴表示式;
(3) 遇到運算元時,將其壓入S2;
(4) 遇到運算子時,比較其與S1棧頂運算子的優先順序:
(4-1) 如果S1為空,或棧頂運算子為右括號“)”,則直接將此運算子入棧;
(4-2) 否則,若優先順序比棧頂運算子的較高或相等,也將運算子壓入S1;
(4-3) 否則,將S1棧頂的運算子彈出並壓入到S2中,再次轉到(4-1)與S1中新的棧頂運算子相比較;
(5) 遇到括號時:
(5-1) 如果是右括號“)”,則直接壓入S1;
(5-2) 如果是左括號“(”,則依次彈出S1棧頂的運算子,並壓入S2,直到遇到右括號為止,此時將這一對括號丟棄;
(6) 重複步驟(2)至(5),直到表示式的最左邊;
(7) 將S1中剩餘的運算子依次彈出並壓入S2;
(8) 依次彈出S2中的元素並輸出,結果即為中綴表示式對應的字首表示式。
**/
#include<iostream>
#include<stack>
#include<string.h>
using namespace std;
int pri(char a){
switch(a){
case '+':
return 1;
case '-':
return 1;
case '*':
return 2;
case '/':
return 2;
}
}
int main(){
char express[100];
stack<char> S1,S2;
cout<<"輸入表示式: ";
cin>>express;
cout<<"您輸入了:"<<express<<endl;
char c;
for(int i=strlen(express)-1;i>=0;i--){
c=express[i];
if(c>='a' && c<='z')
S1.push(c);
else if(c==')'||S2.empty()==1||S2.top()==')'){
S2.push(c);
}
else if(c=='('){
while(S2.top()!=')'){
S1.push(S2.top());
S2.pop();
}
S2.pop();
}
else{
while(S2.empty()==0 && pri(c) < pri(S2.top())){
S1.push(S2.top());
S2.pop();
}
S2.push(c);
}
}
while(S2.empty()!=1){
S1.push(S2.top());
S2.pop();
}
cout<<"輸出 ";
while(S1.empty()!=1){
cout<<S1.top();
S1.pop();
}
return 0;
}