读入一个只包含 +、-、*、/ 的非负整数计算表达式,计算该表达式的值。

输入

测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。

输出

对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。

输入样例

1 + 2
4 + 2 * 5 - 7 / 11
0

输出样例

3.00
13.36

思路

记录这道题的几个要点,把这几个要点解决了这道题就没什么问题了:

  1. 搞懂中缀表达式求值的算法
  2. 输入的表达式中,数字和运算符以空格分隔,所以在读取输入时要做特殊处理,利用空格信息来处理输入
  3. 输出保留两位小数

1. 中缀表达式求值算法

建立数栈,存数;建立符栈,存运算符。运算符之间有优先级,例如 " * " 优先级大于 " + ",需要有一个函数来判断运算符之间的优先级。
顺序扫描表达式,遇到数则入数栈,遇到运算符,则比较此运算符与栈顶的运算符的优先级,若栈顶运算符的优先级大于等与此运算符,则将栈顶运算符弹出,并从数栈弹出两个数,计算其值。比如,在扫描 " 1 * 2 + 3 " 时,扫描到 " + " 时,栈顶运算符为 " * ",则弹出 " * "与1、2,并计算 1 * 2 的值,将此值入数栈。若栈顶运算符优先级小于此运算符,则将此运算符入符栈。
为了使第一个运算符顺利入栈,需要在符栈栈底先加入一个优先级最低的 " # ",为了使所有运算符能正确出栈运算,需要在字符串末尾加上优先级次低的 " $ "。当#$相遇时,运算即结束。由于此题无非法表达式,只需要让二者最后都入栈即可,无需判断是否合法,所以采取了这样的方式。

2. 输出保留两位小数

C++中保留两位小数的操作与C中不同
需要先加入头文件#include<iomanip>
在需要保留小数时,利用setprecision()函数来控制保留的位数

另外,若输出是保留n位小数,则还需要加上fixed固定小数点位置
例如:num = 4.33333,输出保留3位小数
code : cout<<fixed<<setprecision(3)<<num; output: 4.333

若输出保留n位有效数字,则直接用setprecision()即可
例如:num = 4.33333,输出保留3位有效数字
code : cout<<setprecision(3)<<num; output: 4.33

代码

#include<iostream>
#include<cstdlib>
#include<string>
#include<vector>
#include<algorithm>
#include<stack>
#include<iomanip>
using namespace std;/*题目描述:表达式求值为比较运算符的优先级,需要在运算符栈中插入一个优先级最低的运算符,在表达式末尾插入同样运算符
*/
bool isNum(char c){if('0' <= c && c <= '9') return true;else return false;
}
int priority(char c){switch(c){case '#':return 1;case '$':return 2;case '+':return 3;case '-':return 3;case '*':return 4;case '/':return 4;}
}
double calculate(double num1,char c, double num2){switch(c){case '+': return num1+num2;case '-': return num1-num2;case '*': return num1*num2;case '/': return num1/num2;}
}
int main(){stack<double> number;stack<char> op;string str;getline(cin, str);while(str != "0"){str += " $";op.push('#');double num = 0;for(int i = 0;i < (int)str.size();i++){if(isNum(str[i])){ //处理输入数num = num*10 + (str[i]-'0');}else if(str[i] == ' ' && num){ //此时数已读取完成,将其入栈number.push(num);num = 0;}else if(str[i] != ' '){ //处理运算符while(priority(str[i]) <= priority(op.top())){double num1,num2;char c;num2 = number.top(); number.pop();num1 = number.top(); number.pop();c = op.top(); op.pop();number.push(calculate(num1,c,num2));}op.push(str[i]);}}cout<<fixed<<setprecision(2)<<number.top()<<endl;number.pop();while(!op.empty()) op.pop();getline(cin,str);}return 0;
}

简单计算器(浙大复试题)表达式求值相关推荐

  1. iOS仿写计算器中缀转后缀 表达式求值

    github地址 iOS计算器 准备工作 由于OC没有自带的栈文件,只能链表模拟栈 typedef struct {char data[50];int top; }Stack;//符号栈 //之前把D ...

  2. leetcode 227. Basic Calculator II | 227. 基本计算器 II(中缀表达式求值)

    题目 https://leetcode.com/problems/basic-calculator-ii/ 题解 这道题是 中缀表达式求值 的简化版(因为没有左右括号运算),不过输入的形式有两个处理起 ...

  3. c语言求不定式的最大值,C语言之四则运算表达式求值(链栈)—支持浮点型数据,负数, 整型数据运算...

    运算符间的优先级关系: 链栈结构体定义: 数据域使用字符串长度为20的字符数组(故需要注意判断读取的字符串是运算符还是数值) 可支持浮点型数据,负数, 整型数据的运算 float EvaluateEx ...

  4. leetcode 282. Expression Add Operators | 282. 给表达式添加运算符(中缀表达式求值)

    题目 https://leetcode.com/problems/expression-add-operators/description/ 题解 中缀表达式求值问题,参考:leetcode 227. ...

  5. ssis 表达式任务_SSIS表达式任务与将变量作为表达式求值

    ssis 表达式任务 In this article, I will first give an introduction about SSIS expressions, then I will de ...

  6. [计蒜客 15504 百度的科学计算器(简单)]表达式求值

    [计蒜客 15504 百度的科学计算器(简单)]表达式求值 分类: Math 表达式求值 1. 题目链接 [计蒜客 15504 百度的科学计算器(简单)] 2. 题意描述 求一个只带加减的实数表达式. ...

  7. 字符串算术表达式求值-简单计算器实现(栈)-数据结构和算法(Java)

    1 字符串算术表达式分类 字符串算术表达式分为前缀表达式.中缀表达式和后缀表达式.其中前缀表达式又称波兰表达式,后缀表达式基于前缀表达式,又称逆波兰表达式.下面给出百度百科关于几种表达式的定义: 前缀 ...

  8. 牛客题霸 [表达式求值] C++题解/答案

    牛客题霸 [表达式求值] C++题解/答案 题目描述 请写一个整数计算器,支持加减乘三种运算和括号. 题解: 没有除法emmm 我们从头开始依次判断每个字符 如果是左括号,我们就找右括号,并截取括号内 ...

  9. 利用SLR实现可编程计算器(表达式求值)

    有些计算器,只能进行单步计算,就是说只能输入数字和加减乘除四则运算符号,而不能有括号的出现.可编程计算器就是指能输入括号.数字和四则运算符号,并对所输入的四则运算表达式进行分析,得最终计算出结果的计算 ...

最新文章

  1. Spring Boot与数据访问
  2. 报销流程不简单,OA平台的私人订制
  3. Docker技术快速精通指南
  4. safari 获取视频流_如何在Safari中将RSS feed和社交媒体合并为一个流
  5. leetcode-92-反转链表②
  6. 有一台服务器远程失败其他电脑可以_使用闲置电视盒子打造家庭网盘和远程下载器和小型服务器(二)...
  7. 字符串之字符判断以及字母的大小写转换
  8. 【C】课堂结对联系-求整数数组的子数组之和的最大值(党云龙、黄为)
  9. WordPress主题 酱茄模块源码
  10. 删除mysql 执行计划_如何清除某条SQL的执行计划
  11. 关于Nginx里面的配置文件里面的location参数的意思
  12. 安卓输入法 车机版_触宝输入法HD
  13. 深度学习中初始化权重
  14. MFC工具箱中各种控件
  15. PHP SQL 注入攻击的技术实现以及预防办法
  16. 计算机打印驱动怎么安装,打印机驱动怎么安装,详细教您打印机驱动怎么安装...
  17. it行业计算机考试认证全集
  18. 如何把Java代码写的简洁
  19. (3)verilog与Systemverilog两种语言编写二分频
  20. FreeEIM - 沟通最简单

热门文章

  1. html 在线聊天工具,给你的外贸网站增加一个在线聊天工具吧
  2. 刘萌150206318
  3. 运输道路变“大型烟花现场”?资产监测设备避免烟花运输发生意外!
  4. 阿里云视频点播SDK(获取视频地址)
  5. AVI文件的音视频数据简析
  6. oracle execute immediate 报错,oracle中execute immediate的使用(select/insert/update/delete)...
  7. 北京交通大学 计算机 调剂,2020考研调剂信息:北京交通大学硕士研究生调剂
  8. 2020警博会,快商通邀您共赏声纹风“警”线
  9. 计算机应用word单元测试,[高职统考}计算机应用基础word2003单元测试题(3)
  10. php mysql写入数据不成功,向MYSQL中安插数据不成功