栈与队列:逆波兰计算器(逆波兰表达式;后缀表达式)把运算符放到运算量后边 && 中缀表达式转化为后缀表达式

  1 //1.实现对逆波兰输入的表达式进行计算如(2-1)*(2+3)= 5  就输入2 1 - 2 3 + *   //先把2 1 压栈 遇到-弹栈 再把2 3压进去 遇到+弹栈 最后遇到*弹栈
  2 //2.支持带小数点的数据
  3 例: 正常操作----->逆波兰表达式
  4      a+b   ------>a b +
  5      a+(b-c)----->a b c - +
  6      a+(b-c)*d--->a b c - d * +
  7      a+d*(b-c)--->a d b c - * +
  8 
  9 //2 5 + 4 2 - *  == (2+5)*(4-2) == 14
 10 //1 34 + 4 2 / * ==(1+34)*(4/2)== 70 
 11 #include<stdio.h>
 12 #include<stdlib.h>
 13 #include<ctype.h>  //函数isdigit  检查是否为十进制数 
 14 
 15 #define MAXSIZE 100
 16 #define MAXBUFFER 10 //缓冲区 
 17 
 18 typedef double ElemType;  
 19 
 20 typedef struct
 21 {
 22     ElemType *base;
 23     ElemType *top;
 24     int sizeStack;
 25 }sqStack;
 26 
 27 void InitStack(sqStack *s)
 28 {
 29     s->base = (ElemType *)malloc(MAXSIZE*sizeof(ElemType));
 30     if(!s->base)
 31     {
 32         exit(0);
 33     }
 34     s->top = s->base;
 35     s->sizeStack = MAXSIZE;
 36 }
 37 
 38 void Push(sqStack *s,ElemType e)
 39 {
 40     if(s->top - s->base == s->sizeStack)
 41     {
 42         exit(0);
 43     }
 44     *(s->top) = e;
 45     s->top++;
 46 }
 47 
 48 void Pop(sqStack *s,ElemType *e)
 49 {
 50     if(s->top == s->base)
 51     {
 52         return;
 53     }
 54     *e = *(--(s->top));
 55 }
 56  
 57 int main(void)
 58 {
 59     sqStack s;
 60     char c;
 61     char str[MAXBUFFER];
 62     double d,e;
 63     int i = 0;
 64     
 65     InitStack(&s);
 66     printf("请输入后缀表达式的字符,运算符与数字用空格隔开\n");
 67     scanf("%c",&c);
 68     while(c != '#')
 69     {
 70         while(isdigit(c) || c=='.')  //判断是否遇到数字
 71         {
 72             str[i++] = c;
 73             str[i] = '\0';
 74             if(i >= 10)
 75             {
 76                 printf("单个数字太大啊"); 
 77                 return -1;
 78             }
 79             scanf("%c",&c);
 80             if(c == ' ')
 81             {
 82                 d = atof(str);  //将字符串转换成浮点型  存在<stdlib.h>
 83                 Push(&s,d);
 84                 i = 0;
 85                 break; 
 86             }
 87         }
 88 
 89         switch(c) //判断是否遇到运算符
 90         {
 91             case '+':
 92                 Pop(&s,&e);
 93                 Pop(&s,&d);
 94                 Push(&s,d+e);
 95                 break;
 96             case '-':
 97                 Pop(&s,&e);
 98                 Pop(&s,&d);
 99                 Push(&s,d-e);
100                 break;
101             case '*':
102                 Pop(&s,&e);
103                 Pop(&s,&d);
104                 Push(&s,d*e);
105                 break;
106             case '/':
107                 Pop(&s,&e);
108                 Pop(&s,&d);
109                 if(e != 0)
110                 {
111                     Push(&s,d/e);
112                 }
113                 else
114                 {
115                     printf("被除数不能为0!\n");
116                     return -1;
117                 }
118                 break;
119         }
120         scanf("%c",&c);
121     }
122     Pop(&s,&d);
123     printf("最终结果为:%f",d);
124     return 0;
125 }
126 
127 
128 
129 //将中缀表达式转化为后缀表达式
130 #include<stdio.h>
131 #include<stdlib.h>
132 
133 #define MAXSIZE 20
134 #define INCREMENTSIZE 10
135 
136 typedef char ElemType; 
137 typedef char ElemType2;
138 typedef struct 
139 {
140     ElemType *base;
141     ElemType *top;
142     int StackSize;
143 }sqStack;
144 
145 void InitStack(sqStack *s)
146 {
147     s->base = (ElemType *)malloc(MAXSIZE*sizeof(ElemType));
148     if(!s->base)
149     {
150         printf("内存分配失败!\n");
151         exit(0);
152     }
153     s->top = s->base;
154     s->StackSize = MAXSIZE;
155 } 
156 
157 void Push(sqStack *s, ElemType e)
158 {
159     if(s->top - s->base == s->StackSize)
160     {
161         s->base = (ElemType *)realloc(s->base,(s->StackSize+INCREMENTSIZE)*sizeof(ElemType));
162         if(!s->base)
163         {
164             printf("重新分配内存失败!\n");
165             exit(0); 
166         }
167         s->top=s->base+s->StackSize;
168         s->StackSize=s->StackSize+INCREMENTSIZE;
169     }
170     *(s->top) = e;
171     s->top++;
172 }
173 
174 void Pop(sqStack *s,ElemType *e)
175 {
176     if(s->top == s->base)
177     {
178         return;
179     }
180     *e = *(--(s->top));
181 }
182 
183 int StackLen(sqStack s)
184 {
185     return (s.top - s.base);
186 }
187 
188 int main(void)
189 {
190     sqStack s;
191     char c,e;
192     
193     InitStack(&s);
194     printf("请输入中缀表达式\n");
195     scanf("%c",&c);
196     while(c !='#')
197     {
198         
199         while(c>='0' && c<='9')
200         {
201             printf("%c",c);
202             scanf("%c",&c);
203             if(c<'0' || c>'9')
204             {
205                 printf(" ");
206             }
207         }
208         
209         if(c==')')
210         {
211             Pop(&s,&e);
212             while(e != '(')
213             {
214                 printf("%c ",e);
215                 Pop(&s,&e);
216             }
217         }
218         else if(c=='+' || c=='-')
219         {
220             if(!StackLen(s))
221             {
222                 Push(&s,c);
223             }
224             else
225             {
226                 do
227                 {
228                     Pop(&s,&e);
229                     if(e == '(')
230                     {
231                         Push(&s,e); //遇到左括号就弹走就ok 
232                     }
233                     else
234                     {
235                         printf("%c ",e);
236                     }
237                     
238                 }while(StackLen(s) && e!='(');
239                 Push(&s,c);
240             }
241         }
242         else if(c=='/' || c=='*' || c=='(')
243         {
244             Push(&s,c);
245         }
246         else if(c == '#')
247         {
248             break;
249         }
250         else 
251         {
252             printf("数据输入错误啊!\n");
253             return -1;
254         }
255         scanf("%c",&c);
256     }
257     while(StackLen(s))
258     {
259         Pop(&s,&e);
260         printf("%c ",e);
261     }
262     return 0;
263 }

 

上一篇:栈的相关操作


下一篇:这是关于线性表的一串代码以及一长串解释