中綴表達式轉后綴表達式


中綴表達式轉后綴表達式的方法:
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 } 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM