hdu 1237 简单计算器 (表达式求值)【stack】
<题目链接>
题目大意:
Input测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
Output对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
Sample Input
1 + 2 4 + 2 * 5 - 7 / 11 0
Sample Output
3.00 13.36
解题分析:
表达式求值简单题,只涉及四则运算,我们只需要借助栈,将中缀表达式转化为后缀表达式进行计算即可。
#include <cstdio> #include <cstring> #include <stack> #include <algorithm> using namespace std; ]; int change(char c){ //将每个运算符都转化为数字,方便比较和区分 ; ; ; ; ; } int cmp(int a,int b){ //比较运算符的优先级 ||a==)a=; ; ||b==)b=; ; ; ; } void solve(){ stack<double>a; //后缀数字栈 stack<int>b; //运算符栈 int len=strlen(str); //将中缀表达式借助栈转化为后缀表达式 ;i<len;i++){ if(str[i]==' ')continue; //遇到空格,跳过 '){ //将连续的数字字符转化为数字 ; '){ cal=cal*+str[i]-'; i++; } a.push(cal); } if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/'){ int temp=change(str[i]); if(b.empty())b.push(temp); //如果开始栈空,则无需比较 else{ int res=b.top(); while(cmp(res,temp)){ //运算符栈里的优先级大于当前的,就先运算栈顶优先级大的,最后再将当前操作符(temp)压入栈内 double a1=a.top();a.pop(); //弹出2个操作数 double b1=a.top();a.pop(); int c=b.top();b.pop(); //弹出运算符栈里的运算符 switch(c){ : a.push(a1+b1); break; : a.push(b1-a1); //这里为什么是b1-a1? break; : a.push(a1*b1); break; : a.push(b1/a1); break; } if(b.empty())break; //如果栈空,就终止 else res=b.top(); //否则继续比较运算符栈顶和当前运算符的优先级 } b.push(temp); //将这个运算符压入栈内 } } } while(!b.empty()){ //当栈b内仍然有运算符时,说明运算还未结束 double a1=a.top();a.pop(); double b1=a.top();a.pop(); int c=b.top();b.pop(); switch(c){ : a.push(a1+b1); break; : a.push(b1-a1); break; : a.push(a1*b1); break; : a.push(b1/a1); break; } } printf("%.2lf\n",a.top()); } int main(){ ")){ solve(); } ; }
2018-10-04
hdu 1237 简单计算器 (表达式求值)【stack】的更多相关文章
- OpenJudge计算概论-简单算术表达式求值
/*===================================== 简单算术表达式求值 总时间限制: 1000ms 内存限制: 65536kB 描述 2位正整数的简单算术运算(只考虑整数运 ...
- hdu 1237 简单计算器
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1237 简单计算器 Description 读入一个只包含 +, -, *, / 的非负整数计算表达式, ...
- hdu 1237 简单计算器(栈处理)
简单计算器 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- Openjudge-NOI题库-简单算术表达式求值
题目描述 Description 两位正整数的简单算术运算(只考虑整数运算),算术运算为: +,加法运算:-,减法运算:*,乘法运算:/,整除运算:%,取余运算. 算术表达式的格式为(运算符前后可能有 ...
- Openjudge-计算概论(A)-简单算术表达式求值
描述: 两位正整数的简单算术运算(只考虑整数运算),算术运算为: +,加法运算:-,减法运算:*,乘法运算:/,整除运算:%,取余运算. 算术表达式的格式为(运算符前后可能有空格):运算数 运算符 运 ...
- HDU 1237 简单计算器 栈
额,题目是中文的,题意就不用说了= =都看懂喽.写个字符串先把这行计算式存进去,不过不能存一个算一个,因为考虑到乘除法比加减法优先的原则,如果是加号减号就先存着等待计算,如果是乘号除号就直接算出来值就 ...
- HDU 1237 简单计算器(栈+stringstream)
提供几份代码,这题的输入可以用stringsteam处理,先处理乘除后处理加减,正常思路,但是后面统计加减法的时候,对栈的运用错了,我用的时候相当于给它多加了几个括号就错了. 正确的简单解法就是,加法 ...
- 随手练——HDU 1237 表达式求值(输入格式典型)
坑了老子半天,结果是 float 范围不够!!! 基本思想: 开一个符号栈,一个数字栈: 碰到数字就入栈,碰到符号就与栈顶符号进行对比,如果当前符号优先级小于栈顶符号,数字栈弹出两个数进行栈顶符号运算 ...
- 【NYOJ-35】表达式求值——简单栈练习
表达式求值 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min ...
随机推荐
- VMware虚拟机安装Linux系统centos7(一)
1.安装虚拟机(自行百度) 2.编辑虚拟机设置 光驱设置,镜像选择:(也可设置2核2G,基于自己计算机选择!) 3.点击开启此虚拟机(上下键选择安装,回车) 4.选择语言 5.设置 如果想安装图形化界 ...
- linq2db.EntityFrameworkCore 介绍
linq2db.EntityFrameworkCore 是一个ef core的插件,对linq语法的扩展 对复杂的sql都有很好的支持,他是基于linq2db (provided by LINQ To ...
- laravel 更新
public function update(Request $request, ResponseFactoryContract $response) { $user = $request->u ...
- 编辑技巧之如何跟PDF文档添加贝茨编号
除了office办公软件,pdf文档现在使用的频率也便多了,不论是工作或是学习,阅读都用阅读器打开就行了,可是如果想要修改.编辑那只用阅读器是无法进行编辑的,其实PDF文件的编辑还是很方便,使用PDF ...
- python(2): If/for/函数/try异常/调试/格式输出%
(一) if if a1==a2: print('ok') if: else: if: elif: ... else: 注意缩进 猜数字游戏 from random import randint ...
- stream to byte[], byte[] to srting
byte[] myBinary = new byte[paramFile.Length]; paramFile.Read(myBinary, , (int)paramFile.Length); str ...
- D.Starry的神奇魔法(矩阵快速幂)
/*D: Starry的神奇魔法 Time Limit: 1 s Memory Limit: 128 MB Submit My Status Problem Description ...
- urls.py的配置[路由配置]
urls.py的配置[路由配置] Get请求与Post请求的方式 get请求: (1)地址栏输入url (2)<a href="请求url">点击</a> ...
- config.GetSection(key)编译不通过
要安装这个版本
- JDK1.8 JVM参数配置
JAVA_OPTS=" -server #服务器模式 -Xmx4g #JVM最大允许分配的堆内存,按需分配 -Xms4g #JVM初始分配的堆内存,一般和Xmx配置成一样以避免每次gc后JV ...