P1449 后缀表达式题解--Sabrinadol--Sabrina

题目描述
所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。

如:3*(5–2)+7对应的后缀表达式为:3.5.2.-*7.+@。’@’为表达式的结束符号。‘.’为操作数的结束符号。

输入输出格式
输入格式:
输入:后缀表达式

输出格式:
输出:表达式的值

输入输出样例
输入样例#1:
3.5.2.-*7.+@
输出样例#1:
16
说明
字符串长度,1000内。
此题其实不难,就是一个简单的栈的运用,有兴趣的也可以试试数组,不过较为贴切计算机的工作原理,我们通过代码(ac)来进行讲解

#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>//不加此文件虽然在自己电脑可以通过编译,但是在洛谷云端中会编译错误
#include<stack>
using namespace std;
stack<long long int >s;//因为害怕数过大所以采用longlong
char h[3000];
int len=0;
int k[1000];
int ans=0;
int main()
{
	cin>>h;
	len=strlen(h);
	int kx=0;
	int now=0;
	for(int i=0;i<len;i++)
	{
		if('0'<=h[i]&&h[i]<='9')
		{
			 now*=10;//完成进位
			 now+=h[i]-'0';//
		}
		 else if(h[i]=='.')
		{
			ans++;
	       	s.push(now);//将数入栈
	        now=0;//重新初始化
    	}
    	//接下来的算法可以通过手动模拟后缀式计算得到
    	//显然,当我们遇到计算符号时,我们需要做的操作就是将最后进去的两个数进行运算
    	//然后我们将得到的结果覆盖这两个数
    	else if(h[i]=='-')
    	{
    		int kx=s.top();
    		s.pop();
    		s.top()-=kx;
    	}
    	else if(h[i]=='*')
    	{
    		int kx=s.top();
    		s.pop();
    		s.top()*=kx;
    	}
    	else if(h[i]=='+')
    	{
    		int kx=s.top();
    		s.pop();
    		s.top()+=kx;
    	}
    	else if(h[i]=='/')
    	{
    		int  kx=s.top();
    		s.pop();
    		s.top()/=kx;
    	}
    	else if(h[i]=='@')
    	{
    		break;
    	}
	}
	cout<<s.top();//,因为我们每次计算后都将结果覆盖在了栈顶,最后直接输出栈顶就行了
	while(1)
	cout<<"Sabrina"<<endl;//防copy
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值