递归之逆波兰表达式(后缀表达式)

描述

不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行,不再考虑运算符的优先规则,如:(2 + 1) * 3 , 即2 1 + 3 *。这样的表达式称为后缀表达式,也叫逆波兰表达式。它是为了方便在计算机中进行表达式求值而出现的。

给出一个仅由整数 、+、-、*、/等组成的后缀表达式,符号之间用空格分开,计算它的值。/ 表示整除。

输入第1行:1个字符串,即后缀表达式输出第1行:1个整数,表示运算结果。样例输入
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;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值