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 所属: 数据结构->线性结构->栈 问题: 给定一个表达式字符串数组,返回该表达式的逆波兰表达式(即去掉括号). ...
随机推荐
- JUnit之参数化测试、套件/成组测试的使用
原文地址http://blog.csdn.net/yqj2065/article/details/39967065 参数化测试 正如数组替代int a0,a1,a2一样,测试加法时assertEqua ...
- Linux系统——Raid磁盘阵列
Raid磁盘阵列 作用:解决磁盘速度.安全问题 Raid原理 Raid0 写入速度极快,有几块硬盘,写入速度就近似几倍,但是安全性极差,只要一块盘坏了,所有盘的数据全部坏掉,最少两块硬盘组合 性价比最 ...
- Ubuntu下pycharm设定任务栏图标后打开出现问号图标
事情是这样的: ubuntu16.04,安装好pycharm后,bin下只有一个sh执行文件,想要弄成任务栏图标,所以在/usr/share/applications下新建文件pycharm.desk ...
- HTTPS复习
Https Https其实是两个协议,即HTTP协议和SSL协议,但是由于HTTP协议应用广泛,而且需要为其提供数据隐私保护,所以将HTTP协议与SSL协议结合.HTTP属于应用层,在远古时代,它只需 ...
- Pyspark访问Hbase
作者:Syn良子 出处:http://www.cnblogs.com/cssdongl/p/7347167.html 转载请注明出处 记录自己最近抽空折腾虚拟机环境时用spark2.0的pyspark ...
- Linux查找含有某字符串的文本文件
转自:http://www.cnblogs.com/wangkongming/p/4476933.html 如果你想在当前目录下 查找"hello,world!"字符串,可以这样 ...
- 基于JWT的token身份认证方案
一.使用JSON Web Token的好处? 1.性能问题. JWT方式将用户状态分散到了客户端中,相比于session,可以明显减轻服务端的内存压力. Session方式存储用户id的最大弊病在于S ...
- pom.xml常用元素解析
project 最外层元素 modelVersion 指定Maven模型的版本号,对于Maven2和Maven3,它只能是4.0.0 version 版本信息 groupId 包id,会生成相应路径 ...
- kali 2.0下搭建DVWA环境
DVWA (Dam Vulnerable Web Application)DVWA是用PHP+Mysql编写的一套用于常规WEB漏洞教学和检测的WEB脆弱性测试程序.包含了SQL注入.XSS.盲注等常 ...
- 再谈CSS动画 - 说点不知道的(一)贝塞尔曲线
今天重新翻看<CSS 揭秘>"过渡与动画"一章,并把该章代码重新敲了一遍,代码托管在我的Github,在此总结一些心得. 动画的奥秘 在网页中添加动画的目的是让用户有更 ...