HDU-1237 简单计算器(使用栈和不用栈的解法)
来源:互联网 发布:编程谜题 pdf 编辑:程序博客网 时间:2024/06/08 06:05
简单计算器
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 20707 Accepted Submission(s): 7393
Problem Description
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
Input
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
Output
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
Sample Input
1 + 24 + 2 * 5 - 7 / 110
Sample Output
3.0013.36
Source
浙大计算机研究生复试上机考试-2006年
Recommend
JGShining
一道数据结构题,考察的是栈的应用。
如果要用栈来写,思路是这样的:
首先建立两个栈,一个栈用来存储操作符(以下简称符栈),另一个栈用来存储运算数(以下简称数栈)。
从前往后按字符依次读取:
如果遇到数字:
则先判断它是不是多位数,如果是,则要把所有位数都读进去,把结果压入数栈中。
如果遇到运算符:
1.如果符栈为空,直接入栈。
2.如果栈顶符号的优先级大于当前符号,计算,否则也把它压入符栈中。
最后读取完成时,把数栈里的数值和符栈里的运算符依次出栈,得到结果:
#include<stdio.h>#include<string.h>#include<stack>using namespace std;int main(){ int i; double a,b; char s[250],c; while(gets(s),strcmp(s,"0")!=0) { stack<char>s1; stack<double>s2; for(i=0;s[i];i++) { if(s[i]>='0'&&s[i]<='9') { a=0; while(s[i]>='0'&&s[i]<='9') { a=a*10+s[i]-'0'; i++; } i--; s2.push(a); } else if(s[i]=='-'||s[i]=='+') { if(!s1.empty()) { c=s1.top(); s1.pop(); a=s2.top(); s2.pop(); b=s2.top(); s2.pop(); if(c=='+') a+=b; else a=b-a; s2.push(a); s1.push(s[i]); } else s1.push(s[i]); } else if(s[i]=='/') { b=0; i+=2; while(s[i]>='0'&&s[i]<='9') { b=b*10+s[i]-'0'; i++; } i--; a=s2.top(); s2.pop(); a=a/b; s2.push(a); } else if(s[i]=='*') { b=0; i+=2; while(s[i]>='0'&&s[i]<='9') { b=b*10+s[i]-'0'; i++; } i--; a=s2.top(); s2.pop(); a=a*b; s2.push(a); } } while(!s1.empty()) { c=s1.top(); s1.pop(); a=s2.top(); s2.pop(); b=s2.top(); s2.pop(); if(c=='+') a+=b; else a=b-a; s2.push(a); } printf("%.2f\n",s2.top()); } return 0;}
这段代码来自:http://blog.sina.com.cn/s/blog_7fec19cd0101107i.html
我不是用栈写的,这里也附上我的代码:
#include<iostream>#include<algorithm>#include<cstdio>#include<cstdlib>#include<iomanip>using namespace std;int main(){double a[300];int i;double s;char f;while (cin>>s){memset(a, '\0', sizeof(a));a[0] = s;i = 0;f = getchar();if (s==0&&f=='\n'){break;}while (1){cin >> f >> s;switch (f){case'*':a[i] *= s;break;case'/':a[i] /= s;break;case'+':a[++i] = s;break;default:a[++i] = -s; break;}if (getchar()=='\n'){break;}}double sum = 0;for (i;i>=0;i--){sum += a[i];}printf("%.2lf\n", sum);}return 0;}
0 0
- HDU-1237 简单计算器(使用栈和不用栈的解法)
- hdu 1237简单计算器(栈的简单应用)
- hdu -1237- 简单计算器(栈实现)
- hdu 1237 简单计算器(栈)
- HDU 1237 简单计算器 (栈)
- 【HDU】1237 - 简单计算器(栈)
- 【HDU】-1237-简单计算器(栈)
- HDU:1237 简单计算器(栈)
- hdu 1237 简单计算器 栈
- HDU 1237 简单计算器(栈)
- HDU 1237:简单计算器【栈】
- HDU - 1237 - 简单计算器(栈)
- HDU-1237 简单计算器【栈】
- HDU 1237 简单计算器(栈的应用)
- hdu 简单计算器(栈)
- HDU 1237(简单计算器)栈的应用-表达式求值
- HDU 1237 简单计算器 (栈模拟)
- hdu 1237 简单计算器(数组模拟栈,队列)
- 指针:c++指针
- [Hibernate]Hibernate的HQL查询
- Redis 性能测试记录
- 三十、热部署
- javaweb学习笔记(二)-DTD技术
- HDU-1237 简单计算器(使用栈和不用栈的解法)
- office2010/2013/2016安装过程提示问题Office 16 Click-to-Run Extensibility Component
- [Hibernate]Hibernate的QBC查询
- Stm32-DS18B20的使用
- 剑指offer-旋转数组的最小数字
- shell脚本实现MBR、GPT自动分区及格式化
- Java环境配置及eclipse单元测试
- Egret 性能优化总结
- 多线程实现——新龟兔赛跑