简单计算器 - 九度教程第27题

题目:

时间限制:1 秒 内存限制:32 兆 特殊判题:否
题目描述:
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
输入:
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结
束,相应的结果不要输出。
输出:
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
样例输入:
1 + 2
4 + 2 * 5 - 7 / 11
0
样例输出:
3.00
13.36
来源:
2006年浙江大学计算机及软件工程研究生机试真题

解析:

利用堆栈对表达式求值的方法:
1.设立两个堆栈,一个用来保存运算符,另一个用来保存数字
2.在表达式首尾添加标记运算符,该运算符运算优先级最低。
3.从左至右依次遍历字符串,若遍历到运算符,则将其与运算符栈的栈顶元素进行比较,若运算符栈的栈顶运算符优先级小于该运算符或者此时运算符栈为空,则将该运算符压入堆栈。遍历字符串中下一个元素。
4.若运算符栈的栈顶运算符优先级大于该运算符,则弹出栈顶运算符,再从数字栈中依次弹出两个栈顶数字,完成弹出的运算符对应的运算并得到结果后,再将该结果压入数字栈,重复比较此时栈顶运算符与当前遍历到的运算符优先级,视其优先级大小重复步骤3或步骤4。
5.若遍历到表达式中的数字,则直接压入数字栈
6.若运算符堆栈中仅存有两个运算符栈顶元素为我们人为添加的标记运算符,那么表达式运算结束,此时数字堆栈中唯一的数字即为表达式的值。

代码:

#include<stdio.h>
#include<stack>
using namespace std;
char str[201];   //保存表达式字符串
int mat[][5]={   //优先级矩阵,若mat[i][j]==1,则表示i号运算符优先级大于j号运算符,//运算符编码规则为+为1号,-为2号,*为3号,/为4号,//我们人为添加在表达式首尾的标记运算符为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,
};
stack<int> op;   //运算符栈,保存运算符号
stack<double> in;//数字栈,运算结果可能存在浮点数,所以保存元素为doublevoid getOp(bool &reto,int &retn,int &i)
{//获得表达式中下一个元素函数,若函数运行结束时,引用变量reto为true,则表示该元素为一个运算符,其编号保存在引用变量retn中;//否则,表示该元素为一个数字,其值保存在引用变量retn中,引用变量i表示遍历到的字符串下标if(i==0&&op.empty()==true){//若此时遍历字符串第一个字符,且运算符栈为空,我们认为添加编号为0的标记字符reto=true; //为运算符retn=0;    //编号为0return;    //返回}if(str[i]==0)   //若此时遍历字符串为空字符,则表示字符串已经被遍历完{reto=true;  //返回为运算符retn=0;     //编号为0的标记字符return;     //返回}if(str[i]>='0' && str[i]<='9')//若当前字符为数字{reto=false; //返回为数字retn=0;     //返回结果为数字for(;str[i]!=' ' && str[i]!=0;i++){           //若字符串未被遍历完,且下一个字符不是空格,则依次遍历其后数字,计算当前连续数字字符表示的数值retn*=10;retn+=str[i]-'0';}             //计算该数字的数字值if(str[i]=' ')//若其后字符为空格,则表示字符串未被遍历完{i++;      //i递增,跳过该空格return;}}else              //否则{reto=true;    //返回为运算符if(str[i]=='+')//加号返回1{retn=1;}else if(str[i]=='-') //减号返回2{retn=2;}else if(str[i]=='*') //乘号返回3{retn=3;}else //除号返回4 if(str[i]=='/'){retn=4;}i+=2;    //i递增,跳过该运算字符和该运算字符后的空格return;  //返回}return;      //返回
}
int main()
{while(gets(str))//输入字符串,当其位于文件尾时,gets返回0{if(str[0]=='0'&&str[1]==0) break;//若输入只有一个0,则退出bool retop;int retnum;               //定义函数所需的引用变量int idx=0;                //定义遍历到的字符串下标,初始值为0while(!op.empty())  op.pop();while(!in.empty())  in.pop();//清空数字栈,和运算符栈while(true){                //循环遍历表达式字符串getOp(retop,retnum,idx);//获取表达式中下一个元素if(retop==false)        //若该元素为数字{in.push((double)retnum);//将其压入数字栈中}else{double tmp;if(op.empty()==true || mat[retnum][op.top()]==1){op.push(retnum);}else{  //若运算符堆栈为空或者当前遍历到的运算符优先级大于栈顶元素,将该运算符压入运算符栈while(mat[retnum][op.top()]==0)//!!!!!这个地方是==,不是={//只要当前运算符优先级小于栈顶元素运算符,则重复循环int ret=op.top();//保存栈顶运算符op.pop();        //弹出double b=in.top();in.pop();double a=in.top();in.pop();        //从数字堆栈栈顶弹出两个数字,依次保存在遍历a、b中if(ret==1)tmp=a+b;else if(ret==2)tmp=a-b;else if(ret==3)tmp=a*b;else tmp=a/b;in.push(tmp);   //将结果压回数字栈}op.push(retnum);    //将当前运算符压入运算符堆栈}}if(op.size()==2 && op.top()==0)break;//若运算符堆栈只有两个元素,且其栈顶元素为标记运算符,则表示表达式求值结束}printf("%.2f\n",in.top());     //输出数字栈中唯一的数字,即为答案}return 0;
}

while(mat[retnum][op.top()]==0)  //!!!!!这个地方是==,不是=

找错误的时候,找了半天,才发现是这错了!!!要细心呐!!!吐血......

例3.2 简单计算器 - 九度教程第27题(栈的应用)相关推荐

  1. Piggy-Bank - 九度教程第 102 题

    Piggy-Bank - 九度教程第 102 题 题目 时间限制:1 秒 内存限制:32 兆 特殊判题:否 题目描述: Before ACM can do anything, a budget mus ...

  2. 质因数的个数 - 九度教程第54题

    质因数的个数 - 九度教程第54题 题目 时间限制:1 秒 内存限制:32 兆 特殊判题:否 题目描述: 求正整数 N(N>1)的质因数的个数. 相同的质因数需要重复计算.如 120=22235 ...

  3. 不容易系列之一(九度教程第 94 题)

    不容易系列之一(九度教程第 94 题) 时间限制:1 秒 内存限制:128 兆 特殊判题:否 1.题目描述: 大家常常感慨,要做好一件事情真的不容易,确实,失败比成功容易多了!做好"一件&q ...

  4. Excel排序 九度教程第4题

    题目链接 题目描述: Excel可以对一组纪录按任意指定列排序.现请你编写程序实现类似功能. 对每个测试用例,首先输出1行"Case i:",其中 i 是测试用例的编号(从1开始) ...

  5. 数制转换 九度教程第44题 a进制数转换为b进制数 不同进制之间相互转换

    题目链接 解题思路: 1.将a进制数转换成十进制数: 2.将十进制数转换成b进制数: 3.使用do while 循环,可以确保即使被转换数字是 0 ,程序也能正常工作. AC代码: #include& ...

  6. 成绩排序 九度教程c语言,九度OJ 1089 数字反转

    题目分析: 使用队列存放每一位的数字,然后输出并计算得到反转数值,从而实现数字反转. 源代码: [cpp] #include #include using namespace std; int mai ...

  7. 九度oj 第1题 二维数组中的查找 何海涛:《剑指Offer:名企面试官精讲典型编程题》

    一.题目信息 题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 输入: ...

  8. 动态规划 背包问题小结 0-1背包(采药 九度第101题) 完全背包(Piggy-Bank POJ 1384) 多重背包(珍惜现在,感恩生活 九度第103题)

    本小结介绍0-1背包.完全背包以及多重背包问题 记忆要点: 0-1背包:二维数组情况下,顺序遍历体积或者倒序均可以                降维情况下需倒序遍历体积 完全背包:数组降维+顺序遍历 ...

  9. 求java简单计算器源代码_java简单计算器源代码

    简单计算器代码 package calcultorthree; import java.awt.BorderLayout;//导入边界布局管理器类 import java.awt.GridLayout ...

  10. 九度OJ题目1019:简单计算器

    题目1019:简单计算器 时间限制:1 秒 内存限制:32 兆 特殊判题:否 题目描述: 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. 输入: 测试输入包含若干测试用 ...

最新文章

  1. 循序渐进看Java web日志跟踪(1)-Tomcat 日志追踪与配置
  2. 代码覆盖率工具 Istanbul 入门教程
  3. ITK:将标量映射到Jet Colormap中
  4. 最小生成树KrusKal算法(并查集)
  5. 牛客网 【每日一题】6月8日 [SCOI2005]最大子矩阵
  6. java锁_Java锁
  7. 【Java】命令行生成JavaDoc文档
  8. MySQL基础篇(01):经典实用查询案例,总结整理
  9. SharePoint 2013 文档库中PPT转换PDF
  10. 自增主键为什么不是连续的?
  11. 生成发布包_制作R包指南
  12. NX文件名与工程图名自动关联
  13. 在这个世界我只喜欢三件事---暮光之城
  14. javascript原生脚本代码 飘浮广告
  15. 波浪下划线怎么设置_如何在word中的文字下面加波浪线
  16. 读取二代身份证上的相片,函数GetBmp(char * Wlt_File,int intf) 怎么用?
  17. python开发office插件_看完这篇Python操作PPT总结,从此使用Python玩转Office全家桶就没有压力了!...
  18. Yahoo大规模时列数据异常检测技术及其高性能可伸缩架构
  19. Apache Kudu 与 Impala Shell 的结合使用文档(创建表、删、改、查)
  20. 页面通过js获取并加载远程html文件,移除html文件中不需要的内容,修改html文件中img图片的路径

热门文章

  1. oracle和sqlserver数据库直接生成xml
  2. Python游戏开发入门2 壁球小游戏与图像的基本使用
  3. 七月算法机器学习 9 推荐系统与应用
  4. 181006扇贝有道每日一句
  5. C++从屏幕输入数字以空格分割,存入整型数组
  6. Atitit Queue consum algo 队列消费算法fifo lifo ro目录1. 队列消费算法 11.1. FIFO 先入先出 11.2. LIFO 后入先出 不能多开 1
  7. Atitit uke plnsy安全隐私保护法案 目录 第一章 一般规定 2 第1节 主题与目标 2 第二章 常见安全原则 3 第1节 隔离 保密 shell 3 第2节 隐藏 保密 不出头 3
  8. Atitit 常见数据结构之编程语言源文件与编译文件 目录 1.1. 通过反射api得到结构 1 1.2. 通过源码ast信息 1 2. 常见语言 1 2.1. Php ast 解析 1 2.2.
  9. Atitit httpclient 概述  rest接口
  10. Atitit.注解and属性解析(2)---------语法分析 生成AST attilax总结 java .net