Description
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值
Input
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出
Output
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位
Sample Input
1 + 2
4 + 2 * 5 - 7 / 11
0
Sample Output
3.00
13.36
Solution
模拟四则运算过程,对于整个输入的串,遇到数字则提取出来进数字栈,遇到加减运算则进运算符栈,遇到乘除运算则从数字栈中拿出栈顶元素与运算符之后提取出的整数进行运算并将结果进数字栈,这样当枚举完整个串的元素后,我们就得到了一个只有加减运算的表达式,但因为这个表达式在栈中的顺序是反的,所以要再开两个栈来将这个表达式反序,之后就每次从数字栈栈顶取出两元素,从运算符栈中取出一个运算符,将运算结果压进数字栈中,最后数字栈剩下的一个元素即为表达式的最终结果
Code

#include<cstdio>
#include<cstring>
#include<iostream>
#include<stack>
using namespace std;
int main()
{char s[222];while(gets(s),strcmp(s,"0")){int len=strlen(s);stack<double>num;//存储整数 stack<char>op;//存储运算符 for(int i=0;i<len;i++){if(s[i]==' ')//空格直接跳过 continue;else if(s[i]=='*'||s[i]=='/')//乘除法,运算完后将结果进栈 {double x=num.top();//拿出数字栈中的栈顶元素 num.pop();double y=0;int j;for(j=i+2;j<len;j++)//提取出字符串中的整数 {if(s[j]!=' ')y=y*10+s[j]-'0';elsebreak;}//将结果进栈 if(s[i]=='*')num.push(x*y);elsenum.push(x/y);i=j;}else if(s[i]=='+'||s[i]=='-')//加减法,直接进栈 op.push(s[i]);else//数字则提取出来进栈 {double y=0;int j;for(j=i;j<len;j++){if(s[j]!=' ')y=y*10+s[j]-'0';elsebreak;}i=j;num.push(y);}}//因为进栈之后出栈顺序与运算顺序相反,所以要将栈内元素反转 stack<double>nnum;stack<char>oop;while(!num.empty()){double temp=num.top();nnum.push(temp);num.pop();}while(!op.empty()){char temp=op.top();oop.push(temp);op.pop();}while(!nnum.empty()&&!oop.empty()){double x=nnum.top();//拿出第一个整数 nnum.pop();double y=nnum.top();//拿出第二个整数 nnum.pop();char ope=oop.top();//拿出运算符 oop.pop();//将结果进栈 if(ope=='+')nnum.push(x+y);elsennum.push(x-y);}printf("%.2lf\n",nnum.top());}return 0;
}

HDU 1237 简单计算器(模拟)相关推荐

  1. HDU - 1237简单计算器(输出问题)

    简单计算器 HDU - 1237 题目 题解 代码 题目 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. Input 测试输入包含若干测试用例,每个测试用例占一行,每行 ...

  2. HDU 1237 简单计算器

    简单计算器 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  3. HDU - 1237 简单计算器

    Description 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. Input 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之 ...

  4. java 杭电1237简单计算器

    简单计算器 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  5. 【HDU】1237 简单计算器 (stack)

    http://acm.hdu.edu.cn/showproblem.php?pid=1237 题目很好理解,一开始想用优先队列,但好像有点难实现,用stack比较好实现,遇到" * &quo ...

  6. 模拟一个简单计算器_阅读模拟器的简单介绍

    模拟一个简单计算器 Read simulators are widely being used within the research community to create synthetic an ...

  7. Python基础项目实践之:面向对象方法模拟简单计算器

    Python课堂基础实践系列: Python基础项目实践之:学生信息管理系统 python基础项目实践之: 学生通讯录管理系统 Python基础项目实践之:面向对象方法模拟简单计算器 Python基础 ...

  8. 【PTA题目解答】习题6-7 简单计算器 (20 分)模拟简单运算器的工作。

    习题6-7 简单计算器 (20 分)模拟简单运算器的工作. 习题6-7 简单计算器 (20 分)模拟简单运算器的工作.假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运算符的优先级相同,按从 ...

  9. L2-1 简单计算器 (25 分)详解c语言 模拟堆栈

    L2-1 简单计算器 (25 分) 本题要求你为初学数据结构的小伙伴设计一款简单的利用堆栈执行的计算器.如上图所示,计算器由两个堆栈组成,一个堆栈 S​1存放数字,另一个堆栈 S​2 存放运算符.计算 ...

最新文章

  1. MALTLAB 求出水仙花数
  2. jQuery如何使用css方法修改单个样式?
  3. python远程创建linux用户_如何设置远程访问的Jupyter Notebook服务器-02:如何创建Linux用户?...
  4. 作为JBoss AS 7模块运行Drools 5.4.0 Final
  5. validation 参数校验和统一异常处理
  6. Vue 实现图片在循环中 默认 和 选中 之间的点击切换
  7. Qt之QLocalSocket
  8. Centos 7安装RabbitMQ 3.7.8版本(单机版)-不使用RPM
  9. 【修复版】ONE兔3.0版本社交社区交友婚恋视频即时通讯双端APP原生源码
  10. 微信小程序 - 实现简单登录和个人信息页面
  11. java 如何获取前时间的日期,比如两个月前的日期
  12. 怎么批量查询银行卡号是哪个银行?
  13. linux系统触摸板双击,在Ubuntu 18.04系统中搞定触摸板多点触控
  14. 各种门平面图画法_关于CAD各种门怎么画平面图就行 CAD铝合金门窗
  15. 商场三十六计——第5计 “趁火打劫”
  16. JAVA基础:面向对象的例外处理
  17. 用Python爬取淘宝商品
  18. 堆排序--10亿个数字取出最大或者最小的10个数字
  19. windows系统下载安装JDK8
  20. OpenWrt开发者沙龙:立方体CEO何铮演讲

热门文章

  1. 数据库SQL的编写顺序和执行顺序
  2. 恋词题源报刊Unit1背诵
  3. 联想yoga14s和联想小新pro13哪个好
  4. Three.js——向量操作函数
  5. Latex学习笔记——latex中的中文处理办法
  6. Fresnel(菲涅尔)
  7. 自家群晖开启永久免费图床,开始typora, picgo,markdown的美好生活
  8. [www.infoshare.cc]MonkeyRunner(1)——基本使用方法,一驾考宝典这款APP为例
  9. 支付宝扫“福”字活动马上开始,看我如何使用python制作一个“福”字吧
  10. 如何在一个固态硬盘中塞下二个操作系统