描述
不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行,不再考虑运算符的优先规则,如:(2 + 1) * 3 , 即2 1 + 3 *。这样的表达式称为后缀表达式,也叫逆波兰表达式。它是为了方便在计算机中进行表达式求值而出现的。
给出一个仅由整数 、+、-、*、/等组成的后缀表达式,符号之间用空格分开,计算它的值。/ 表示整除。
2 1 + 3 *样例输出
9解题思路1
递归:请参考我的《递归之波兰表达式》的解法,方法非常的类似,但是这道题的区别在于不用交换减数(除数)和被减数(被除数)的位置,因为逆波兰表达式是倒着遍历的,先找到的数字是减数,传入int f1(int a,char b,int c)中的c位置,之后找到的的是被减数,存放的位置是a,所以不用交换。
解题思路2
栈思想: 因为栈有后进先出的特点,所以当我们输入一个运算符时,在这个运算符之前肯定是有两个数字的,对这两个数字出栈,运算出结果,把结果入栈。
参考程序1(递归)
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
string a[2000];
int i,t;
int f1(int a,char b,int c)
{
switch(b)
{
case'+':return a+c;
case'-':return a-c;
case'*':return a*c;
case'/':return a/c;
}
}
int f2()
{
int i=t;
if(a[i][0]>='0'&&a[i][0]<='9')
{
t--;
return atof(a[i].c_str());
}
t--;
return f1(f2(),a[i][0],f2());
}
int main()
{
string b;
while(cin>>b)
a[++i]=b;
t=i;
printf("%d",f2());
return 0;
}
参考程序2(栈)
#include<iostream>
#include<stack>
#include<cstdlib>
using namespace std;
int main()
{
string s;
stack<int>a;
int x,y;
while(cin>>s)
{
if(s[0]>='0'&&s[0]<='9')
{
x=atoi(s.c_str());
a.push(x);
}
else
{
switch(s[0])
{
case'+':{x=a.top();a.pop();y=a.top();a.pop();a.push(x+y);break;}
case'-':{x=a.top();a.pop();y=a.top();a.pop();a.push(y-x);break;}
case'*':{x=a.top();a.pop();y=a.top();a.pop();a.push(x*y);break;}
case'/':{x=a.top();a.pop();y=a.top();a.pop();a.push(y/x);break;}
}
}
}
cout<<a.top();
return 0;
}
本文介绍了一种特殊的表达式——逆波兰表达式,并提供了两种不同的实现方法:递归方法和栈方法。递归方法通过递归调用进行计算,而栈方法则利用栈的数据结构特性来实现表达式的求值。
&spm=1001.2101.3001.5002&articleId=80112973&d=1&t=3&u=c4ae29b2c79d4154a23b39cde33ae244)
1326

被折叠的 条评论
为什么被折叠?



