數據結構實驗之棧二:一般算術表達式轉換成后綴式


 

題目描述

對於一個基於二元運算符的算術表達式,轉換為對應的后綴式,並輸出之。

輸入

輸入一個算術表達式,以‘#’字符作為結束標志。

輸出

輸出該表達式轉換所得到的后綴式。

示例輸入

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    ·如果后綴表達式未讀完,就重復上面過程,最后輸出棧頂的數值則為結束 */

 


免責聲明!

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



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