简单计算器 逆波兰表达式
问题 C: 悠派计算器
时间限制: 1 Sec 内存限制: 128 MB
提交: 7 解决: 2
[提交][状态][讨论版][命题人:qianyouyou]
题目描述
yoyo的小老弟小渣渣灰特别懒,兴趣爱好并不多,就睡觉一个。为了多睡会儿懒觉,他把数学老师布置的作业全部推给yoyo计算。yoyo很头疼,于是请你帮他写一个计算器帮忙计算。现有多个数学表达式,请你写一个计算器算出结果,表达式只包含'+''-''*''/''%''('')'操作,其中表达式中'-'作为减运算符,不会作为负号出现,此外'/'为整除运算符,'%'为取余运算符。表达式保证合法。
输入
输入第一行t,表示共有t行测试用例,接下来t行每一行均为一个合法的数学表达式。保证每个数在[09999]范围内,保证计算过程中不会出现超范围情况。(注:没有空格)
输出
输出计算结果
样例输入
7
0*1
5%6
1-2*(3+4*5%6)+7/8-9*10%11*12
(1+2*3)
1-(100%5)
(3+2*5)/(5)
(11-11)+(33)*64-11
样例输出
0
5
-135
7
1
2
2101
提示
数据很水,不用考虑long long或取余等情况。
题解
逆波兰表达式是一种十分有用的表达式,它将复杂表达式转换为可以依靠简单的操作得到计算结果的表达式。例如(a+b)(c+d)转换为ab+cd+
如果当前字符为变量或者为数字,则压栈,如果是运算符,则将栈顶两个元素弹出作相应运算,结果再入栈,最后当表达式扫描完后,栈里的就是结果。
例如(a+b)(c+d)转换为ab+cd+ 计算机在计算普通表达式时,要对运算优先级用递归进行判断,对于更为复杂的表达式会使计算机运算效率变低甚至崩溃。而逆波兰表达式只需要进行简单的入栈出栈操作就可以完成任何普通表达式的运算。
普通表达式——>逆波兰表达式
(1)a+b——>a b +
(2)a+(b-c)——>a b c - +
(3)a+(b-c)d——>a b c - d +
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100007;
map<char,int>Pri;//其实可以不必用map,只是为了方便大家理解map而多添加的一步
stack<int>num;
stack<char>Ope;
char str[maxn];
//初始化
void init(){Pri['+'] = Pri['-'] = 1;Pri['*'] = Pri['/'] = Pri['%'] = Pri['('] = Pri[')'] = 2;while(!num.empty())num.pop();while(!Ope.empty())Ope.pop();
}
//基本运算操作
void operation_1(int &a,int &b, char c){if(c == '+')a += b;else if(c == '-')a = b-a;else if(c == '*')a *= b;else if(c == '/')a = b/a;else if(c == '%')a = b%a;
}
//遇到+或者)时执行的操作
void operation_2(){char ch = Ope.top();while(ch != '('&&!Ope.empty()){Ope.pop();int a = num.top();num.pop();int b = num.top();num.pop();operation_1(a,b,ch);num.push(a);if(!Ope.empty())ch = Ope.top();}if(!Ope.empty()&&Ope.top() == '(')Ope.pop();
}
int main(){int t;cin>>t;getchar();while(t--){cin.getline(str,maxn);stringstream s(str);init();char tmp;while(s >> tmp){//遇到数字字符时,需要判断下一位是否依旧是数字,是的话需要合并if(tmp >= '0' && tmp <= '9'){int t = 0;do{if(Pri[tmp]){break;}t *= 10;t += tmp - '0';}while(s >> tmp);num.push(t);}//遇到')'时if(tmp == ')'){operation_2();}//遇到'+' ‘-’时else if(Pri[tmp]==1){if(!Ope.empty()&&Ope.top()!='('){operation_2();}Ope.push(tmp);}else if(Pri[tmp]){Ope.push(tmp);}}int ans = num.top();num.pop();while(!num.empty()&&!Ope.empty()){operation_1(ans,num.top(),Ope.top());Ope.pop();num.pop();}cout << ans << endl;}return 0;
}
简单计算器 逆波兰表达式相关推荐
- 逆波兰计算器android源码简书,计算器的核心算法-JavaScript实现(逆波兰表达式)...
最终计算器的掩饰效果,欢迎大家来找BUG. http://codepen.io/lvanboy/full/LxKVxJ/ 功能: 1.按照运算符的优先级运算 2.利用上次的结果继续运算 3.多个数字混 ...
- 逆波兰表达式简单介绍
逆波兰表达式又叫做后缀表达式.在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,所以,这种表示法也称为中缀表示.波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示表达式的 ...
- C语言栈的运用:后缀表达式(逆波兰表达式)计算器
原理很简单,当操作者输入中每遇数字便将数字压入数栈,每遇符号便进行两次弹栈进行该符号的运算,运算结果再次压入数栈.唯一要注意的一点就是进行除法运算时需要判断除数是否为0. 头文件: /*Captain ...
- 牛客 五子棋 逆波兰表达式计算器
五子棋题目 牛客上一个比较有意思的思路,只需要判断四个方向 代码 import java.util.*; public class Main{public static boolean is(char ...
- 数据结构 - 栈 (逆波兰计算器)(栈的三种表达式)(前缀、中缀和后缀表达式,后缀也叫逆波兰表达式)(中缀表达式转后缀表达式实现步骤及完整代码)
栈的三种表达式:前缀.中缀和后缀表达式,后缀也叫逆波兰表达式 前缀(波兰表达式) 中缀(对人来讲很好理解,对于计算机来讲就方便了,一般会把中缀表达式转换成后缀表达式) 后缀(逆波兰表达式) 计算过程 ...
- Java 逆波兰表达式完成计算器
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 三大表达式 一.中缀转后缀 二.逆波兰表达式计算 总结 三大表达式 前缀表达式 中缀表达式 :就是我们平时常见的表达式 对人来说 ...
- 栈应用-逆波兰表达式(CPP实现简单易懂图解)
栈应用-逆波兰表达式(后缀表达式) 逆波兰表达式定义: 在由运算符(operator)和操作数(operand)组成的表达式中不使用括号(parenthesis-free)即可表示带优先级的运算关系 ...
- java用逆波兰表达式实现字符串计算器
1.java版本 import java.math.BigDecimal; import java.util.*;/*** @return* @author Tmz* @description:* ...
- 【栈】【150. 逆波兰表达式求值】【中等】(需回顾)
根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话说 ...
最新文章
- ​西湖大学EMBLab诚聘环境工程学、生物信息学、分子生态学科研助理
- springboot启动流程
- (转)web.xml 中的listener、 filter、servlet 加载顺序及其详解
- sklearn模型支持输入list吗?
- ajaxSubmit的data属性
- MySQL 的DDL DML DQL DCL细节解析 知道这些就够了
- MFC异形窗口-多边形窗口-根据图片自定义窗口形状-CRgn
- 计算机表格斜杠怎么打,excel表格打斜杠的方法步骤图详解
- 怎么用美图秀秀制作证件照
- Nature:Jeff Dangl团队揭示贪噬菌属在微生物组中维持根的生长
- .html怎么查看源代码,html的网页源代码怎么查看
- 魔兽延迟最低的服务器,魔兽世界延迟高怎么回事_魔兽世界延迟高解决方法_玩游戏网...
- Python 抓取数据并可视化
- Ubuntu 17.04下安装64位谷歌Chrome浏览器
- 樊登36个问题建立亲密关系_拉近亲密关系的36个问题
- cad的lisp画线_CAD画缓和曲线lisp程序
- 万网域名和ip绑定最新详细步骤
- 办理护照(学生集体户口)~备用
- UE4 材质UV纹理不随模型缩放拉伸
- 基于串口通信的DSP应用程序在线升级方法
热门文章
- centos7装机教程
- C#调用C++编写的DLL函数各种参数传递问题
- java 网络传输中发送byte[]和接收到的不一致_为什么JAVA对象需要实现序列化?
- elementui 响应式导航栏网站_什么是响应式网站?响应式网站的优势介绍
- 比亚迪汉鸿蒙系统测评_余承东携鸿蒙OS亲自站台,比亚迪汉凭借刀片电池能否对抗Model 3?...
- 单调不减序列查询第一个大于等于_[力扣84,85] 单调栈
- android java和c混合编程_C/C++在Java项目、Android和Objective-C三大平台下实现混合编程...
- 六十八、完成Vue项目推荐和周末游组件,并使用Ajax发起ajax请求
- 那份让我想死的化工原理补考试卷
- 概率分布的熵归一化(Entropy Normalization)