逆波兰表达式求值问题(c语言代码)
逆波兰表达式求值
提示:注意输入有空格,运用continue即可解决
前言
逆波兰表达式求值就是计算后缀式,优点在于不需要括号。
1 输入样例 1 2 + 1 2 * + 输出样例 5 2 输入样例 1 1 + 2 * 输出样例 4
一、解题思路
1.分析
由样例1可知从左到右先遇到一个数字 1 存下来,然后遇到一个数字 2 存下来,再遇到一个符号 + 此时取出2和1,进行计算 1+2 得到结果 3 存下来,继续向右遇到数字 1 存下来,向右遇到数字 2 存下来,再向右遇到符号 * 此时取出 2和1,进行计算2*1得到结果 2 存下来,向右遇到符号 + ,此时取出2和3 进行计算3+2 得到结果 5 存下来,存下来,最后输出 5 。此过程符合栈的存储方式
2.思路
所以解题思路: 1遇到数字就入栈。 2遇到符号就取出栈中两个数字,先是取出栈顶元素给B,再取出栈顶元素给A,后进行A ±*/ B计算,后将结果存回栈中,即栈顶元素为计算结果。 3最后字符数组为空时结束,取出栈顶元素并输出。
二、代码实现
#include <stdio.h> #include <stdlib.h> typedef int AElemType; typedef struct Astatus* AStatus; struct Astatus { AElemType Data; struct Astatus* Next; }; AStatus ACreatstatus() { AStatus headnode=(AStatus)malloc(sizeof(struct Astatus)); headnode->Next=NULL; return headnode; } AStatus APush(AStatus D,int X) { AStatus newnode=(AStatus)malloc(sizeof(struct Astatus)); newnode->Data=X; newnode->Next=D->Next; D->Next=newnode; } AStatus APop(AStatus D) { if(D->Next==NULL) return -1; AStatus p=D->Next; int X; X=p->Data; D->Next=p->Next; free(p); return X; } AStatus ATop(AStatus D) { if(D->Next==NULL) return -1; return D->Next->Data; } int AIsempty(AStatus D) { if(D->Next==NULL) return -1; return 0; } int main() { char scan[1024]; gets(scan); AStatus D=ACreatstatus();//存储数字的栈 int i=0; int x,y,z; int change; int sum=0; for(i=0;scan[i]!=0;i++) { if(scan[i]== ) continue; if((scan[i]>=0)&&(scan[i]<=9)) { sum=0; while((scan[i]>=0)&&(scan[i]<=9)) { change=scan[i]-0; sum=sum*10+change; i++; } APush(D,sum); i--; } else if(scan[i]==+) { y=APop(D); x=APop(D); z=x+y; APush(D,z); } else if(scan[i]==-) { y=APop(D); x=APop(D); z=x-y; APush(D,z); } else if(scan[i]==*) { y=APop(D); x=APop(D); z=x*y; APush(D,z); } else if(scan[i]==/) { y=APop(D); x=APop(D); z=x/y; APush(D,z); } } printf("%d",ATop(D)); return 0; }
总结
提示:这里对文章进行总结: 记住以下即可:遇到数字入栈,遇到符号计算。
上一篇:
通过多线程提高代码的执行效率例子