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 ...
随机推荐
- Confluence 6 安装 SQL Server
如果你还没有在安装可以连接的 Microsoft SQL Server 数据库,请先下载后进行安装.请参考 MSDN 上 Installation for SQL Server 的指南. 有关授权模 ...
- <<人月神话>>阅读体会(一)
第一次听说人月神话还是在大一上学期的导论课那会儿,那会儿好像就已经确定了自己要学软件,于是就去问王建民老师能不能给我推荐几本软件工程方面的书,我想要提前自己学学,以为老师会给我推荐一些某种语言类的学习 ...
- LeetCode(103): 二叉树的锯齿形层次遍历
Medium! 题目描述: 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如:给定二叉树 [3,9,20,null,nul ...
- laravel 多检索条件列表查询
public function indexQuestions(Request $request, ResponseFactoryContract $response, QuestionModel $q ...
- 使用Eclipse、Tomcat遇到的一些问题
Tomcat服务无法启动 前两天瞎搞,试着弄了弄Android的环境.结果不知道动了什么地方,Tomcat崩了,本地打开localhost:8080一直显示404,eclipse也无法使用Tomcat ...
- java读取pdf和MS Office文档
有时候PDF中的文字无法复制,这可能是因为PDF文件加密了,不过使用PDFBox开源软件就可以把它读出来. 还有一个用于创建PDF文件的项目----iText. PDFBox下面有两个子项目:Font ...
- SRS流媒体服务器搭建+ffmpeg推流VLC取流观看
一.编译SRS https://github.com/winlinvip/simple-rtmp-server 目前有1.0-release.2.0.3.0等版本 2.0官方文档地址:https:// ...
- WCF三种通信方式
一.概述 WCF在通信过程中有三种模式:请求与答复.单向.双工通信.以下我们一一介绍. 二.请求与答复模式 描述: 客户端发送请求,然后一直等待服务端的响应(异步调用除外),期间处于假死状态,直到服务 ...
- python---自己实现二分法列表查找
这是以我自己的思维来实现的,没有用递归. # coding = utf-8 # 二分查找,适用于有序列表,日常编程用不到,因为index函数可以搞定的. # 查找到数字,返回列表中的下标,找不到数字, ...
- golang 中操作nsq队列数据库
首先先在本地将服务跑起来,我用的是docker-compose ,一句话6666 先新建一个docker-compose.yml version: '2' services: nsqlookupd: ...