后缀表达式求值
来源:互联网 发布:sdr软件无线电 飞行 编辑:程序博客网 时间:2024/05/17 16:44
问题 H: 后缀表达式求值
时间限制: 1 Sec 内存限制: 128 MB
提交: 1042 解决: 460
[提交][状态][讨论版]
题目描述
为了便于处理表达式,常常将普通表达式(称为中缀表示)转换为后缀{运算符在后,如X/Y写为XY/表达式。在这样的表示中可以不用括号即可确定求值的顺序,如:(P+Q)(R-S) → PQ+RS-。后缀表达式的处理过程如下:扫描后缀表达式,凡遇操作数则将之压进堆栈,遇运算符则从堆栈中弹出两个操作数进行该运算,将运算结果压栈,然后继续扫描,直到后缀表达式被扫描完毕为止,此时栈底元素即为该后缀表达式的值。
输入
输入一行表示后缀表达式,数与数之间一定有空格隔开(可能不只一个空格),最后输入@表示输入结束。
数据保证每一步的计算结果均为不超过100000的整数。
输出
输出一个整数,表示该表达式的值.
样例输入
14 3 20 5 / *8 - + @
样例输出
18
#include<stdio.h>#include<stdlib.h>#define maxsize 1000typedef struct{ int *base; int *top; int stacksize;}sqstack;void initstack(sqstack &S){ S.base=new int[maxsize]; S.top=S.base; S.stacksize=maxsize;}int stackemperty(sqstack S){ if(S.top==S.base) return 1; return 0;}int stackfull(sqstack S){ if(S.top-S.base==S.stacksize) return 1; return 0;}void push(sqstack &S,int e){ if(S.top-S.base==S.stacksize) {printf("full!\n");exit(0);} *S.top++=e;}void pop(sqstack &S,int &e){ if(S.top==S.base) {printf("emperty\n");exit(0);} e=*--S.top;}void calculate(int num1,int num2,char op,int &sum){ switch(op) { case'-':sum=num1-num2;break; case'+':sum=num1+num2;break; case'*':sum=num1*num2;break; case'/':sum=num1/num2;break; }}int main(){ char b[100],op,d[100]; int c[100],a,sum,num1,num2; int i,num=0,flag=1,flag2=1,k=0,j,l=0; sqstack L; initstack(L); gets(b); for(i=0;b[i]!='\0';i++) { /*if(b[i]==' '&&flag==0) {flag=0;num=0;} if(b[i]=='+'||b[i]=='-'||b[i]=='/'||b[i]=='*'&&(flag==0||flag2==1)) { c[k++]=b[i]; flag2=1; flag=0; num=0; }if(b[i]=='+'||b[i]=='-'||b[i]=='/'||b[i]=='*'&&flag==1) { c[k++]=num+'0';flag=0; c[k++]=b[i]; } if(b[i]==' '&&flag&&flag2==0) {c[k++]=num+'0';flag=0;num=0;} if(b[i]>='0'&&b[i]<='9') {num=num*10+b[i]-'0';flag=1;}*/ /*if(b[i]==' '||(b[i]=='+'||b[i]=='-'||b[i]=='/'||b[i]=='*')) flag=0;*/ if((b[i]=='+'||b[i]=='-'||b[i]=='/'||b[i]=='*')&&flag==0) {d[l++]=b[i];c[k++]=maxsize;} if(b[i]>='0'&&b[i]<='9'&&b[i]!=' ') {num=num*10+b[i]-'0'; flag=1;} if((b[i]==' '||b[i]=='+'||b[i]=='-'||b[i]=='/'||b[i]=='*')&&flag==1) { c[k++]=num;d[l++]='#'; num=0;flag=0; if(b[i]=='+'||b[i]=='-'||b[i]=='/'||b[i]=='*') {d[l++]=b[i];c[k++]=maxsize;} } } //printf("%d\n",k); for(j=0;j<k;j++) { //printf("%d %c\n",c[j],d[j]); if(c[j]!=maxsize&&d[j]=='#') push(L,c[j]); else { if(!stackemperty(L)) {pop(L,num2); pop(L,num1); calculate(num1,num2,d[j],sum); } if(!stackfull(L)) push(L,sum); } } pop(L,sum); printf("%d\n",sum);}/*#include<stdio.h>int main(){ int a; char c; while(~scanf("%d",&a)) { c=a+'0'; printf("%c\n",c); }}*/
阅读全文
0 0
- 后缀表达式的求值
- 后缀表达式求值
- 后缀表达式求值
- 后缀表达式求值
- 后缀表达式求值
- 后缀表达式求值
- 【转载】后缀表达式求值
- 后缀表达式求值
- 后缀表达式求值
- 后缀表达式求值
- 后缀表达式求值
- 后缀表达式求值
- 后缀表达式求值
- 中缀 后缀表达式求值
- 后缀表达式求值
- 后缀表达式求值
- 后缀表达式求值
- 后缀表达式求值
- leetcode 515. Find Largest Value in Each Tree Row
- [Algorithm]Quick Select问题
- node 任务热加载
- 素数距离OJ
- 表达式树的创建与输出
- 后缀表达式求值
- Oracle第四章单行函数习题答案
- 使用okhttp下载一个apk并安装
- Java 垂直等腰直角三角形
- STM8L15X液晶初始化程序
- 交集
- 【JavaScript避免重命名的方法】
- 成绩排序
- jQuery之事件与动画总结