求前缀表达式的值

题目描述

基本思路

无论式前缀,中缀还是后缀表达式,他的叶子节点一定是数字,非叶子节点是运算符

由于是前缀表达式,所以先有运算符,后有数字,于是我们从后往前遍历,每读完一个数字就压入栈中,当读到运算符时,就将栈顶的两个元素取出,计算结果并将值压入栈中,最终栈内剩下的一个元素就是最终答案。

代码

#include<iostream>
#include<stack>
using namespace std;
stack<double>stk;

bool calc(char c)
{
	double a,b;
	a=stk.top();stk.pop();
	b=stk.top();stk.pop();
	if(c=='+')a+=b;
	if(c=='-')a-=b;
	if(c=='*')a*=b;
	if(c=='/')
	{
		if(b==0)return false;
		else a/=b;
	}
	stk.push(a);
	return true;
}

int main()
{
	string s;
	getline(cin,s);//读取一整行的字符串
	for(int i=s.size()-1;i>=0;i--)//倒序遍历
	{
		if(s[i]==' ')continue;//特判一下空格的情况
		else if(isdigit(s[i]))//如果是数字的话
		{
			double mul=10,num=s[i]-'0';//用于计算小数的
			for(int j=i-1;j>=0;j--)
			{
				if(isdigit(s[j]))//数字
				{
					num+=(s[j]-'0')*mul;//此时的情况为  ,假如 s[i]=4,s[i-1]=5  54*6的情况
					mul*=10;
				}
				else if(s[j]=='.')//此时情况为 s[i]=4,s[i-1]='.'  .4*6 此时4要变到小数位置
				{
					num/=mul;
					mul=1;
				}
				else if(s[j]=='-')//负数
				{
					num*=-1;
				}
				else
				{
					i=j;break;
				}
			
			}
			stk.push(num);	
		}
		else //运算符
		{
			if(!calc(s[i]))//错误的情况
			{
				cout<<"ERROR";
				return 0;//直接退出
			}
		}
	}
	printf("%.1f",stk.top());
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值