題目描述
對於一個基於二元運算符的算術表達式,轉換為對應的后綴式,並輸出之。
輸入
輸入一個算術表達式,以‘#’字符作為結束標志。
輸出
輸出該表達式轉換所得到的后綴式。
示例輸入
a*b+(c-d/e)*f#
示例輸出
ab*cde/-f*+
View Code
1 #include<stdio.h> 2 int swi(char c))//把輸入的運算符轉換成數字來比較優先級 3 { 4 if(c=='+'||c=='-') return 1 ; 5 if(c=='*'||c=='/') return 2 ; 6 if(c=='(') return 3 ; 7 if(c==')') return 4 ; 8 return 0 ; 9 } 10 int main() 11 { 12 int top = 0 ; 13 char c=0, stack[100] ; 14 while(scanf("%c", &c), c!='#') 15 { 16 if(c>='a'&&c<='z')//判斷字符是不是運算符 不是就輸出 17 { 18 printf("%c", c) ; 19 } 20 else 21 { 22 if(top==0)//判斷b棧是不是為空 是就直接入棧 23 { 24 top++ ;//棧頂向上移一位 25 stack[top] = c ;//增加一個成員 26 } 27 else 28 if(swi(c)>=swi(stack[top]))]))//如果是運算符 而且輸入的比棧頂運算符優先級高 29 { 30 if(swi(c)==4))//如果是')'就把'('之前的運算符全部輸出 31 { 32 while(stack[top]!='(') 33 { 34 printf("%c",stack[top--]) ; 35 } 36 top-- ; 37 } 38 else 39 { 40 top++ ;//如果不是 就入棧 41 stack[top] = c ; 42 } 43 } 44 else//如果優先級比它低 45 { 46 if(stack[top]!='(')//如果不是'(' 就把它(優先級高)出棧 47 { 48 printf("%c", stack[top]) ; 49 stack[top] = c ; 50 } 51 else 52 { 53 top++ ; 54 stack[top] = c ;//如果是'(' 就直接入棧 55 } 56 } 57 } 58 } 59 while(top!=0)//判斷棧是否為空 不為空就全部出棧 60 { 61 printf("%c", stack[top]) ; 62 top-- ; 63 } 64 printf("\n") ; 65 return 0 ; 66 }
1 /* 將中綴表達式(a+b)轉換為后綴表達式(ab+)的算法思想:
2 ·當讀到數字直接送至輸出隊列中
3 ·當讀到運算符t時,
4 a.將棧中所有優先級高於或等於t的運算符彈出,送到輸出隊列中;
5 b.t進棧
6 ·讀到左括號時總是將它壓入棧中
7 ·讀到右括號時,將靠近棧頂的第一個左括號上面的運算符全部依次彈出,送至輸出隊列后,再丟棄左括號。
8
9 運用后綴表達式進行計算的具體做法:
10 ·建立一個棧S
11 ·從左到右讀后綴表達式,讀到數字就將它轉換為數值壓入棧S中,讀到運算符則從棧中依次彈出兩個數分別到Y和X,然后以“X 運算符 Y”的形式計算機出結果,再壓加棧S中
12 ·如果后綴表達式未讀完,就重復上面過程,最后輸出棧頂的數值則為結束 */
