数据结构03 栈的后缀表达式实现

首先要构造栈,目的是将操作符存入栈中。

有三种情况,优先级一样,优先级比栈顶的高,优先级比栈顶的低。

优先级比栈顶的低或一样,则栈顶的输出,出栈,再将此运算符进栈。

优先级比栈顶的高,则入栈。

‘( ’优先级最高 ,入栈。‘)’不入栈。栈内一直出栈直到‘( ’。

最后直接输出栈内所有元素。

最终输出后缀表达式。

将这个表达式存入另一个栈。这时实现了逆序存储。然后从栈顶遍历,遇到数字存入新的栈,遇到操作符,实用switch实现运算。出栈两次,进栈一次。进栈的为运算结果。最终输出栈顶元素。栈只剩下一个元素。

 

  1 #include <stdio.h>
  2 #include <cstdlib>
  3 #include <string.h>
  4 #define STACK_INIT_SIZE 100
  5 #define STACKINCREMENT 10
  6 
  7 typedef struct {
  8   int *base;
  9   int *top;
 10   int stacksize;
 11 }SqStack;
 12 
 13 int Init(SqStack &S)
 14 {
 15   S.base = (int *)malloc(STACK_INIT_SIZE *sizeof(int));
 16   if (!S.base) return 0;
 17   S.top = S.base;
 18   S.stacksize = STACK_INIT_SIZE;
 19   return 1;
 20 }//Init
 21 
 22 int Push(SqStack &S,int e)
 23 {
 24   if(S.top - S.base >= S.stacksize){
 25     S.base = (int *)realloc(S.base,(S.stacksize + STACKINCREMENT)*sizeof(int));
 26     if(!S.base) return 0;
 27     S.top = S.base + S.stacksize;
 28     S.stacksize += STACKINCREMENT;
 29   }//if
 30   *S.top = e;
 31   S.top++;
 32   return 1;
 33 }//Push
 34 
 35 int Pop(SqStack &S)
 36 {
 37   if (S.top == S.base) return 0;
 38   --S.top;
 39   return 1;
 40 }
 41 
 42 int getTop(SqStack S)
 43 {
 44   return *(S.top - 1);
 45 }
 46 
 47 int main()
 48 {
 49   SqStack S,M,N,P;
 50   Init(S);
 51   Init(M);
 52   Init(N);
 53   Init(P);
 54   char s[100];
 55   int i;
 56   gets(s);
 57   for(i = 0;i < strlen(s);i++)
 58   {
 59       switch(s[i])
 60       {
 61           case '+':
 62       //加法优先级最低
 63       {
 64         if(getTop(S) == '*' || getTop(S) == '/' || getTop(S) == '+' || getTop(S) == '-')
 65         {
 66           printf("%c",getTop(S));
 67               Push(M,getTop(S));
 68           Pop(S);
 69           Push(S,'+');
 70         }
 71 
 72         else
 73           Push(S,'+');
 74       }
 75       break;
 76           case '-':
 77       //减法和加法类似
 78       {
 79         if(getTop(S) == '*' || getTop(S) == '/' || getTop(S) == '+' || getTop(S) == '-')
 80         {
 81           printf("%c",getTop(S));
 82               Push(M,getTop(S));
 83           Pop(S);
 84           Push(S,'-');
 85         }
 86         else
 87           Push(S,'-');
 88       }
 89       break;
 90           case '*':
 91       {
 92         if(getTop(S) == '*' || getTop(S) == '/')
 93         {
 94           printf("%c",getTop(S));
 95           Push(M,getTop(S));
 96           Pop(S);
 97           Push(S,'*');
 98         }
 99         else
100           {
101             Push(S,'*');
102           }
103       }//case
104       break;
105           case '/':
106         {
107             if(getTop(S) == '*' || getTop(S) == '/')
108              {
109                printf("%c",getTop(S));
110                Push(M,getTop(S));
111                Pop(S);
112                Push(S,'/');
113              }
114              else
115                {
116                  Push(S,'/');
117                }
118         }//case
119       break;
120       case '(':
121         Push(S,'(');
122       break;
123       case ')':
124       {
125         while (getTop(S) != '(')
126         {
127           printf("%c",getTop(S));
128               Push(M,getTop(S));
129           Pop(S);
130         }
131         Pop(S);
132       }
133       break;
134           default:
135               {
136                   printf("%c",s[i]);
137                   Push(M,s[i]);
138               }
139         }//switch
140   }//for
141 while(S.base != S.top)
142 {
143   printf("%c",*(S.top - 1));
144   Push(M,*(S.top - 1));
145   Pop(S);
146 }
147 printf("\n");
148 // printf("%c\n",*(M.top - 1));
149     while(M.base != M.top)
150     {
151       Push(N,*(M.top-1));
152       Pop(M);
153     }//while
154 
155     int p = 0;
156     while(N.base != N.top)
157     {
158         if(*(N.top - 1) != '+' && *(N.top - 1) != '-' && *(N.top - 1) != '*' && *(N.top - 1) != '/')
159         {
160       *(N.top - 1) = (int)*(N.top - 1) - 48;
161             *P.top = *(N.top - 1);
162       --N.top;
163             ++P.top;
164         }
165 
166         else
167         {
168       switch(*(N.top - 1))
169             {
170 
171             case '+':
172                 {
173                     p = *(P.top - 2) + *(P.top - 1);
174                     Pop(P);
175                     Pop(P);
176                     Push(P,p);
177                 }
178                 break;
179             case '-':
180                 {
181                     p = *(P.top - 2) - *(P.top - 1);
182                     Pop(P);
183                     Pop(P);
184                     Push(P,p);
185                 }
186                 break;
187             case '*':
188                 {
189                     p = *(P.top - 2) * *(P.top - 1);
190                     Pop(P);
191                     Pop(P);
192                     Push(P,p);
193                 }
194                 break;
195             case '/':
196                 {
197                     p = *(P.top - 2) / *(P.top - 1);
198                     Pop(P);
199                     Pop(P);
200                     Push(P,p);
201                 }
202                 break;
203             }//switch
204             --N.top;
205         }//else
206 
207     }//while
208   printf("表达式结果为:");
209   printf("%d\n",*P.base);
210     return 0;
211 
212 }//main
stack.h

 

 

posted @ 2017-10-31 19:32  佳炜  阅读(281)  评论(0编辑  收藏  举报