前缀表达式求值--栈
2016-02-22 19:58
363 查看
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如
输入在一行内给出不超过30个字符的前缀表达式,只包含
输出前缀表达式的运算结果,保留小数点后1位,或错误信息
2+3*(7-4)+8/4的前缀表达式是:
+ + 2 * 3 - 7 4 / 8 4。请设计程序计算前缀表达式的结果值。
输入格式:
输入在一行内给出不超过30个字符的前缀表达式,只包含+、
-、
*、
\以及运算数,不同对象(运算数、运算符号)之间以空格分隔。
输出格式:
输出前缀表达式的运算结果,保留小数点后1位,或错误信息ERROR。
输入样例:
+ + 2 * 3 - 7 4 / 8 4
输出样例:
13.0
#include<stdio.h> #include<stdlib.h> #include<string.h> #define MAX 10000 struct node{ double num[MAX]; int top; }; int main(void){ struct node *stack=(struct node *)malloc(sizeof(struct node)); stack->top=-1; char expr[MAX][40]; int i=0; while(~scanf("%s",expr[i])){ ++i; } for(--i;i>=0;--i){ if(strlen(expr[i])==1&&(expr[i][0]=='+'||expr[i][0]=='-'||expr[i][0]=='*'||expr[i][0]=='/')){ if(stack->top>=1){ switch(expr[i][0]){ case '+':stack->num[stack->top-1]=stack->num[stack->top]+stack->num[stack->top-1]; stack->top--; break; case '-':stack->num[stack->top-1]=stack->num[stack->top]-stack->num[stack->top-1]; stack->top--; break; case '*':stack->num[stack->top-1]=stack->num[stack->top]*stack->num[stack->top-1]; stack->top--; break; case '/':if(stack->num[stack->top-1]==0){ printf("ERROR\n"); return 0; } stack->num[stack->top-1]=stack->num[stack->top]/stack->num[stack->top-1]; stack->top--; break; } } else{ printf("ERROR\n"); return 0; } } else{ stack->num[++(stack->top)]=atof(expr[i]); } } if(stack->top!=0){ printf("ERROR\n"); return 0; } printf("%.1f\n",stack->num[0]); return 0; }
相关文章推荐
- 对称的二叉树
- 【iOS】手势识别
- BZOJ3091: 城市旅行
- HDOJ-4557 非诚勿扰
- UNIX网络编程卷1 时间获取程序server UDP 协议无关
- Codeforces 629D.( Babaei and Birthday Cake)
- 元宵节
- iOS开发手记-仿QQ音乐播放器动态歌词的实现
- 链表和数组的区别在哪里?
- HDOJ-1087 Super Jumping! Jumping! Jumping!
- NYOJ128--前缀表达式求值--递归版
- static静态局部变量的用法,最直接的解释,一看秒懂!
- 分区存储管理——空闲分区的分配策略
- 1099. Build A Binary Search Tree (30)
- 机房收费系统之数据要求说明书
- 如何用C#动态编译、执行代码
- css定高行级元素垂直居中
- WiFi破解
- 被玩坏的innerHTML、innerText、textContent和value属性
- 图 --- 二分图