求值 模拟

[Description]
小 77 是 2017 级信奥班的成员,因为哲学而出名。
小 77 的数学老师信奉大力刷题出奇迹,于是给他们出了 INF 道简单的数字运算题。每道题
都只包含加号,乘号和十以内的数字。虽然题很简单,但是小 77 觉得这么多题简直是浪费
时间,而他还要忙着钻研哲学,于是决定让你写一个程序自动运算。
[Input]
一行,一个只包含加号,乘号和十以内的数字(即数字范围为[0, 9])的算式。
[Output]
一行一个整数,对算式求值的结果。
[Sample]

 


[Tips]
数字,符号中间可能有一个或多个空格,也有可能没有空格。
算式去除空格后的长度不超过 100, 000。平均情况下每两个符号间有两个空格。
答案不会超过 64 位有符号整数范围。

 


 

记录两个符号和两个数字,每次是乘号就乘上。

我的栈是没必要用的,但是懒得改了。

代码:

 

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>

#define ll long long
#define il inline
#define db double

using namespace std;

int fu[1000045],top;

ll num[1000045],topp;

int main()
{
	freopen("eval.in","r",stdin);
	freopen("eval.out","w",stdout);

	char ch=getchar();

	ll ans=0;

	while(ch!=EOF)
		{
			if(ch=='+')
				fu[++top]=1;
			if(ch=='*')
				fu[++top]=2;
			if(ch>='0'&&ch<='9')
				{
					num[++topp]=ch-'0';
					if(fu[top]==2)
						{
							ll s=num[topp]*num[topp-1];
							num[--topp]=s;
							top--;
						}
				}
			ch=getchar();
		}
   
	for(int i=1;i<=topp;i++)
		ans+=num[i];
	
	printf("%lld\n",ans);

	return 0;
}

 

posted @ 2017-10-20 16:15  GSHDYJZ  阅读(151)  评论(0编辑  收藏  举报