5-20 表達式轉換 (25分)
算術表達式有前綴表示法、中綴表示法和后綴表示法等形式。日常使用的算術表達式是采用中綴表示法,即二元運算符位於兩個運算數中間。請設計程序將中綴表達式轉換為后綴表達式。
輸入格式:
輸入在一行中給出不含空格的中綴表達式,可包含+、-、*、\以及左右括號( ),表達式不超過20個字符。
輸出格式:
在一行中輸出轉換后的后綴表達式,要求不同對象(運算數、運算符號)之間以空格分隔,但結尾不得有多余空格。
輸入樣例:
2+3*(7-4)+8/4
輸出樣例:
2 3 7 4 - * + 8 4 / +
代碼:
1 #include<iostream> 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 using namespace std; 6 #define ERROR 0 7 #define OK 1 8 #define OVERFLOW -2 9 #define TRUE 1 10 #define FALSE 0 11 typedef struct Node *ptr; 12 typedef struct Node{ 13 int *base;//頭指針 14 int *top;//尾指針 15 int stacksize;//最大容量 16 }Sqstack; 17 18 int InitStack(Sqstack &S) //此處是構造一個空棧 19 { 20 S.base = (int *)malloc(100 *sizeof(int)); 21 if (!S.base) exit(OVERFLOW); 22 S.top = S.base; 23 S.stacksize = 100; 24 return OK; 25 } 26 int Push(Sqstack &S,char e)//入棧操作 27 { 28 if(S.top-S.base>=S.stacksize) 29 { 30 S.base=(int *)realloc(S.base,(S.stacksize+10)*sizeof(int)); 31 if(!S.base) exit(OVERFLOW); 32 S.top=S.base+S.stacksize; 33 S.stacksize+=10; 34 } 35 *S.top++=e; 36 return OK; 37 } 38 char GetTop(Sqstack S,char &e)//返回頭頂指針 39 { 40 if(S.top==S.base) 41 return ERROR; 42 else 43 return e=*(S.top-1); 44 } 45 46 char Pop(Sqstack &S,char &e) 47 { 48 if(S.top==S.base) 49 return ERROR; 50 else 51 return e=*--S.top; 52 } 53 54 int isoperator(char op) 55 { 56 switch(op) 57 { 58 case '+': 59 case '-': 60 case '*': 61 case '/': 62 return 1; 63 default: 64 return 0; 65 } 66 } 67 68 int Priority(char op) 69 { 70 switch(op) 71 { 72 case '#':return -2; 73 case '+': 74 case '-': 75 return 1; 76 case '*': 77 case '/': 78 return 2; 79 case '(': return -1; 80 case ')': return 2; 81 default: return -1; 82 } 83 } 84 85 void postfix(char mid[],char post[],int len)//將中綴表達式轉為后綴表達式 86 { 87 int i,j=0; char e; 88 Sqstack abs; 89 InitStack(abs); 90 Push(abs,'#'); 91 for(i=0;i<len;i++) 92 { 93 if(mid[i]>='0'&&mid[i]<='9') 94 { 95 post[j]=mid[i]; 96 j++; 97 } 98 else if(isoperator(mid[i]))//如果接受到的符號是加減乘除的話 99 { 100 while(Priority(mid[i])<=Priority(GetTop(abs,e))) 101 { 102 post[j]=Pop(abs,e); 103 j++; 104 } 105 while(Priority(mid[i])>Priority(GetTop(abs,e))) 106 Push(abs,mid[i]); 107 108 } 109 else if(mid[i]=='(') 110 Push(abs,mid[i]); 111 else if(mid[i]==')') 112 { 113 while(GetTop(abs,e)!='(') 114 { 115 post[j]=Pop(abs,e); 116 j++; 117 } 118 Pop(abs,e); 119 } 120 } 121 while(GetTop(abs,e)!='#') 122 { 123 post[j]=Pop(abs,e); 124 j++; 125 } 126 } 127 int main() 128 { 129 char mid[21],post[21]; 130 int len; 131 scanf("%s",mid);//輸入一個中綴表達式 132 len=(int)strlen(mid); 133 postfix(mid,post,len); 134 for(int i=0;i<len;i++) 135 { 136 cout<<post[i]; 137 } 138 cout<<endl; 139 return 0; 140 }
很慚愧,最后的結果沒有通過所有的數據點,當然例子里面的數據是肯定沒問題的,我不知道自己哪些情況沒有考慮進去,如果你們發現了,歡迎在下面的評論區告訴我QAQ
奇怪,我測試了我能想到的幾乎所有情況,都是對的呀。。。。。