nyoj35——逆波兰表达式
逆波兰表达式又称作后缀表达式,在四则混合运算的程序设计中用到。
例如:
1+2写成后缀表达式就是12+
4+5*(3-2)的后缀表达式就是4532-*+
后缀表达式在四则运算中带来了意想不到的方便,在生成过程中自动保持了优先级;
生成逆波兰表达式的算法如下:
我们首先的用两个栈结构来存储运算符和操作数;
从做到右遍历我们输入的中缀表达式:
1、如果是操作数的话,那么就直接压入存放操作数的堆栈;
2、如果是"("左括号的话,那么就直接压入存放运算符的堆栈;
3、如果是")"右括号的话,那么就从运算符堆栈中弹数据,并将弹出的数据压入到操作数堆栈中,直到遇到"("为止,这里值得注意的是,"("是必须要从运算符堆栈中弹出的,但是不压入到操作数堆栈,后缀表达式中是不包含括号的;
4、如果是其他符号,就是其他的运算符+-*/这些,那么就:
a、如果运算符堆栈为空,则直接压入运算符堆栈;
b、如果不为空且此时运算符堆栈的栈顶元素为括号,包括左括号和右括号,那么也是直接压入运算符堆栈中;
c、如果此时遍历到的元素的优先级比此时运算符堆栈栈顶元素的优先级高,则直接压入运算符堆栈;
d、如果正在遍历的元素的优先级和运算符堆栈栈顶的元素的优先级相等或者更小,则需要将栈顶元素弹出并且放到操作数堆栈中,并且将正在遍历的元素压入到运算符堆栈,其实运算符堆栈中的元素顺序就是优先级的顺序;
5、直到遍历完表达式,此时还需要将运算符堆栈中的所有元素压入到操作数堆栈中,算法完成。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
根据以上算法可以得到逆波兰表达式,我们得到逆波兰表达式之后,必须求得正确的计算结果,有了逆波兰表达式,计算起来就攘夷多了,算法如下:
用另一个堆栈来保存数据,从左到右遍历逆波兰表达式:
1、如果是数字,则直接压入堆栈中;
2、如果是运算符(+,-,*,/),则弹出堆栈中的两个数据,进行相应的计算,计算完成之后得到一个数据,然后又压入堆栈中;
3、直到遍历完成,此时堆栈中的数据就是最后计算的结果,简单吧
以上摘自:https://blog.csdn.net/uestclr/article/details/50630906
AC代码:
#include <bits/stdc++.h>
using namespace std; int prio(char x) //定义优先级
{
switch (x){
case '+': return ;
case '-': return ;
case '*': return ;
case '/': return ;
default : return ; //默认会出现括号,而如果有括号都得压进去
}
} int main()
{
int t;
cin >> t;
while(t--){
stack<char>s;
stack<double>d;
string s1,s2;
cin >> s1;
int i=;
s2 = "";
s.push('#');
while(i < s1.length()-){ // 等于号 不用扫描
if('(' == s1[i]){
s.push(s1[i++]);
}
else if(')' == s1[i]){
while(s.top() != '('){
s2 += s.top();
s2 += ' '; //加空格是为了计算时的方便
s.pop();
}
s.pop();//把左括号弹出
i++;
}
else if(s1[i] == '+'||s1[i] == '-'||s1[i] == '*'||s1[i] == '/'){
while(prio(s.top()) >= prio(s1[i])){
s2 += s.top();
s2 += ' ';
s.pop();
}
s.push(s1[i]);
i++;
}
else{//如果是数字类
while(s1[i] >= ''&&s1[i] <= ''||s1[i] == '.'){
s2 += s1[i++];
}
s2 += ' ';
}
}
while(s.top() != '#'){ //当表达式扫描完,栈中还有剩余符号
s2 += s.top();
s2 += ' ';
s.pop();
} // cout << s2 << endl; double result = ;
i = ;
while(i < s2.length()){
switch (s2[i]){
case '+':
result = d.top();
d.pop();
result += d.top();
d.pop();
i++;
break;
case '-':
result = d.top();
d.pop();
result = d.top() - result;
d.pop();
i++;
break;
case '*':
result = d.top();
d.pop();
result *= d.top();
d.pop();
i++;
break;
case '/':
result = d.top();
d.pop();
result = d.top()/result;//注意因为是栈,所以除法的顺序发生变化
d.pop();
i++;
break;
default:
result = ;
double fac = 10.0;
while(s2[i] >= ''&&s2[i] <= ''){
result = result* + s2[i] - '';
i++;
}
if(s2[i++] == '.'){
while(s2[i] >= ''&&s2[i] <= ''){
result += (s2[i] - '')/fac;
fac *= ;
i++;
}
}
}
// cout << result << endl;
d.push(result);
while(s2[i] == ' '){
i++;
}
}
printf("%.2lf\n",d.top());
}
return ;
}
——
nyoj35——逆波兰表达式的更多相关文章
- [LeetCode] Evaluate Reverse Polish Notation 计算逆波兰表达式
Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, ...
- AC日记——逆波兰表达式 openjudge 3.3 1696
1696:逆波兰表达式 总时间限制: 1000ms 内存限制: 65536kB 描述 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式 ...
- noi1696 逆波兰表达式
1696:逆波兰表达式 http://noi.openjudge.cn/ch0303/1696/ 总时间限制: 1000ms 内存限制: 65536kB 描述 逆波兰表达式是一种把运算符前置的算术 ...
- codevs5164 逆波兰表达式
题目描述 Description 逆波兰表达式是一种把运算符前置的算术表达式(又叫前缀表达式),例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也 ...
- lintcode 中等题:Evaluate Reverse Polish notation逆波兰表达式求值
题目 逆波兰表达式求值 在逆波兰表达法中,其有效的运算符号包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰计数表达. 样例 ["2", "1&q ...
- SDIBT2666——逆波兰表达式求值
逆波兰表达式求值(栈和队列) Description 从键盘上输入一个逆波兰表达式,用伪码写出其求值程序.规定:逆波兰表达式的长度不超过一行,以@符作为输入结束,操作数之间用空格分隔,操作符只可能有+ ...
- OpenJudge 2694 逆波兰表达式
1.链接地址: http://bailian.openjudge.cn/practice/2694/ 2.题目: 总时间限制: 1000ms 内存限制: 65536kB 描述 逆波兰表达式是一种把运算 ...
- 逆波兰表达式 java
描述 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系, 也不必用括号改变运算次序,例如(2 + 3) ...
- c++实现将表达式转换为逆波兰表达式
https://github.com/Lanying0/lintcode 所属: 数据结构->线性结构->栈 问题: 给定一个表达式字符串数组,返回该表达式的逆波兰表达式(即去掉括号). ...
随机推荐
- 小程序页面链接-navigator(导航)
navigator-页面链接-通过设置open-type的值来确定页面的打开方式. <view class="btn-area"> <navigator url= ...
- 如何用meavn构建mahout项目
(1)下载meavn 解压到D盘
- mysql相关配置
http://www.cnblogs.com/cnblogsfans/archive/2009/09/21/1570942.html http://www.jb51.net/article/31902 ...
- python3 对excel读、写、修改的操作
一.对excel的写操作实例: 将一个列表的数据写入excel, 第一行是标题,下面行数具体的数据 import xlwt #只能写不能读 stus = [['姓名', '年龄', '性别', '分数 ...
- Xcode插件开发案例教程
引言 在平时开发过程中我们使用了很多的Xcode插件,虽然官方对于插件制作没有提供任何支持,但是加载三方的插件,默认还是被允许的.第三方的插件,存放在 ~/Library/Application Su ...
- centos6.8安装zabbix
前后用了两台电脑来实验,前后画风不一样,请忽略 一.安装php环境 移除目前系统安装的 PHP 组件 yum remove php* -y 安装 PHP 的 YUM 源 rpm -Uvh http: ...
- openocd shell脚本
openocd.sh #! /usr/bin/expectset timeout 30spawn suexpect "密码:"send "123456\r"se ...
- LightOJ - 1074 Extended Traffic (SPFA+负环)
题意:N个点,分别有属于自己的N个busyness(简称b),两点间若有边,则边权为(ub-vb)^3.Q个查询,问从点1到该点的距离为多少. 分析:既然是差的三次方,那么可能有负边权的存在,自然有可 ...
- cocos2d-x 2.x.x 新建工程 android下的 org文件夹丢失
cocos2d-x 2.x.x 新建工程之后... 打开android项目..会发现src下没有org文件... 解决方法一: cocos2d-x-2.2.0\cocos2dx\platform\an ...
- Pyspark访问Hbase
作者:Syn良子 出处:http://www.cnblogs.com/cssdongl/p/7347167.html 转载请注明出处 记录自己最近抽空折腾虚拟机环境时用spark2.0的pyspark ...