中綴表達式轉后綴表達式的方法:
1.遇到操作數:直接輸出(添加到后綴表達式中)
2.棧為空時,遇到運算符,直接入棧
3.遇到左括號:將其入棧
4.遇到右括號:執行出棧操作,並將出棧的元素輸出,直到彈出棧的是左括號,左括號不輸出。
5.遇到其他運算符:加減乘除:彈出所有優先級大於或者等於該運算符的棧頂元素,然后將該運算符入棧
6.最終將棧中的元素依次出棧,輸出。
pat:表達式轉換(25)
1 #include<stdio.h> 2 #include<stack> 3 #include<ctype.h> 4 using namespace std; 5 int p[300]; 6 int Priority(char a,char b){//判斷優先級 7 if(a=='(')return 0; 8 if(p[a]<p[b])return 0; 9 if(p[a]>=p[b])return 1; 10 } 11 int main(){ 12 char s[30],ans[60],tmp[60]; 13 int i; 14 stack<char> st;//棧,用來存運算符 15 p['+']=p['-']=1;//設置優先級 16 p['*']=p['/']=2; 17 while(scanf("%s",s)!=EOF){ 18 int j=0,k=0;//j:答案的指針;k:標記 19 for(i=0;s[i];i++){ 20 if(s[i]=='(')//左括號直接進棧 21 st.push(s[i]); 22 else if(s[i]==')'){//將左括號后邊的符號依次輸出 23 if(k){ 24 ans[j++]=' '; 25 k=0; 26 } 27 while(st.top()!='('){ 28 ans[j++]=st.top(); 29 ans[j++]=' '; 30 st.pop(); 31 } 32 st.pop();//刪除左括號 33 } 34 else if(s[i]>='0'&&s[i]<='9'||s[i]=='.'){//數字,包括小數 35 ans[j++]=s[i]; 36 k=1; 37 } 38 else{// +-*/ 39 if(k){//如果k==1,說明前面有數字,添加一個空格,並重置k 40 ans[j++]=' '; 41 k=0; 42 } 43 if((s[i]=='+'||s[i]=='-')&&i==0){//正負號 1 44 if(s[i]=='-') 45 ans[j++]=s[i]; 46 continue; 47 } 48 if((s[i]=='+'||s[i]=='-')&&i!=0&&s[i-1]=='('){//正負號 2 49 if(s[i]=='-') ans[j++]=s[i]; 50 st.pop(); 51 while(s[++i]!=')'){//這里的右括號要特殊處理 52 ans[j++]=s[i]; 53 } 54 ans[j++]=' '; 55 continue; 56 } 57 while(!st.empty()&&Priority(st.top(),s[i])){//彈出所有優先級大於或者等於該運算符的棧頂元素,然后將該運算符入棧 58 ans[j++]=st.top(); 59 ans[j++]=' '; 60 st.pop(); 61 } 62 st.push(s[i]); 63 } 64 } 65 if(k){ 66 ans[j++]=' '; 67 k=0; 68 } 69 while(!st.empty()){//最后彈出所有運算符 70 ans[j++]=st.top(); 71 ans[j++]=' '; 72 st.pop(); 73 } 74 ans[j-1]=0;//將最后一個空格去掉 75 puts(ans); 76 } 77 return 0; 78 }