九度OJ 1019 简单计算器
- 题目描述:
-
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
- 输入:
-
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
- 输出:
-
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
- 样例输入:
-
1 + 2 4 + 2 * 5 - 7 / 11 0
- 样例输出:
-
3.00 13.36
-
来源:
2006年浙江大学计算机及软件工程研究生机试真题
注:表达式的运算是栈的一个经典应用,利用这个题来熟悉栈
代码如下:
#include <stdio.h> #include <stack> using namespace std;stack<int> op; stack<double> in; char str[201]; int mat[5][5]={/* + - * / */ /*0标记*/ 1,0,0,0,0, /* + */ 1,0,0,0,0, /* - */ 1,0,0,0,0, /* * */ 1,1,1,0,0, /* / */ 1,1,1,0,0,};void GetOp(bool &reto,int &retn,int &i) { //若i=0且运算符栈为空,则添加一个人为的起止标记符 0,便于最后判断是否结束 if(i==0&&op.empty()==true){reto=true;retn=0;return;}//如果str[i]==0,即为Null,说明字符扫描到头,这时要再添加一个起止标记符 0 ,这样堆栈中有两个 0,满足条件跳出循环 if(str[i]==0){reto=true;retn=0;return;}//如果为数字 ,先标记为false if(str[i]>'0'&&str[i]<'9'){reto=false;} else{reto=true;switch(str[i]){case '+':retn=1;break;case '-':retn=2;break;case '*':retn=3;break;case '/':retn=4;break; }i+=2;//跳过本字符和下一个空格return; }//继续数字的情况,因为数字可能为多位数,此时连续扫描单个字符,要计算数字的真值 retn=0; for(;str[i]!=' '&&str[i]!=0;i++){retn*=10;retn+=str[i]-'0';}//如果str[i]为空格则还未遍历完,修改i的值以继续遍历if(str[i]==' ') i++; return;}int main(int argc, char** argv) {while(gets(str))//输入字符串,当其位于文件尾时,gets返回0 {if(str[0]=='0'&&str[1]==0) break;//当输入只有一个0时结束循环 bool IsOp;int dat;int i=0;while(!op.empty()) op.pop();while(!in.empty()) in.pop();while(true){GetOp(IsOp,dat,i);//如果是数字就直接压栈 if(IsOp==false){in.push(dat);}else{ //如果遍历的为第一个字符(把起止标记符压栈)或者下个运算符优先级高于栈顶运算符 ,则直接入栈 if(op.empty()==true||mat[dat][op.top()]==1){op.push(dat);}//如果优先级低于栈顶 else{while(mat[dat][op.top()]==0){double a=in.top();in.pop();double b=in.top();in.pop();int cal = op.top();op.pop();if(cal==1) in.push(b+a);else if(cal==2) in.push(b-a);else if(cal==3) in.push(b*a);else in.push(b/a);//这里一定要注意a,b 的前后顺序,谁是先出栈的谁是被加/减/乘/除数 }//把运算符压栈 op.push(dat);}}//如果只剩下两个起止符号,说明已经结束 if(op.size()==2&&op.top()==0)break; }printf("%.2lf\n",in.top());}return 0; }
九度OJ 1019 简单计算器相关推荐
- 九度OJ 1019:简单计算器 (基础题、DP)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6725 解决:2454 题目描述: 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. 输入: 测试输入包含若干 ...
- 九度 oj 1019
题目描述: 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. 输入: 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔 ...
- 打不开磁盘配额linux,九度OJ 1455 珍惜现在,感恩生活 -- 动态规划(背包问题)...
题目描述: 为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种大米,每种大米都是袋装产品,其价格不等,并且只能整袋购买.请问:你用有限的资金最 ...
- 九度OJ 1024 畅通工程 -- 并查集、贪心算法(最小生成树)
题目地址:http://ac.jobdu.com/problem.php?pid=1024 题目描述: 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有 ...
- Freckles - 九度 OJ 1144
Freckles - 九度 OJ 1144 题目 时间限制:1 秒 内存限制:128 兆 特殊判题:否 题目描述: In an episode of the Dick Van Dyke show, l ...
- 非常可乐(九度 OJ 1457)
非常可乐(九度 OJ 1457) 时间限制:1 秒 内存限制:32 兆 特殊判题:否 1.题目描述: 大家一定觉的运动以后喝可乐是一件很惬意的事情,但是 seeyou 却不这么认为.因为每次当 see ...
- 九度OJ 题目1179:阶乘
/********************************* * 日期:2013-2-8 * 作者:SJF0115 * 题号: 九度OJ 题目1179:阶乘 * 来源:http://ac.jo ...
- 九度OJ——1028继续畅通工程
题目描述: 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).现得到城镇道路统计表,表中列出了任意两城镇间修 ...
- Leagal or Not - 九度 OJ 1448
Leagal or Not - 九度 OJ 1448 题目 时间限制:1 秒 内存限制:128 兆 特殊判题:否 题目描述: ACM-DIY is a large QQ group where man ...
最新文章
- pycharm 使用小结
- libpcap-mmap分析(五)
- 在MAC上给Anaconda的python安装tensorflow
- 刷新SqlServer所有视图【存储过程】
- Bootstrap中DropDown插件显示下拉列表,点击下拉列表区域,不会再自动关闭。
- [html] 使用canvas制作一个印章
- 《梦断代码》读书笔记1
- gitlab 只能owner 上传_代码管理-gitlab使用方法建议
- 中国风吉祥纹样底纹背景,艾草绿和天青色趋势色彩
- 如何区分两列中不同数据_如何区分原装数据线和山寨数据线
- alibaba 实体转json_JAVA中使用alibaba fastjson实现JSONObject、Object、Json字符串的转换...
- 任务方案思考:句子相似度和匹配
- HTML和XHTML解析(HTMLParser、BeautifulSoup)
- Linux宝库快讯 | OpenInfra中国日正式确定会议合作方
- MySQL5.5安装教程+SQLyog安装
- Discuz收费插件模版合集包;discuz大部分插件下载地址;http://pan.baidu.com/s/1nt5hwU1
- (2022年6月)注册ArcGIS Online(Learn ArcGIS) 21天免费账号笔记
- 计算机硬盘怎么看坏了,SSD固态硬盘坏掉怎么看?有哪几种征兆?
- Linux下线程池概念详解以及代码演示
- ipad协议827版技术分析