5-20 表達式轉換 (25分)


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

奇怪,我測試了我能想到的幾乎所有情況,都是對的呀。。。。。 


免責聲明!

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



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