首页 > 代码库 > HDU 1237 简单计算器(stack)

HDU 1237 简单计算器(stack)

Problem Description
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
 

Input
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
 

Output
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
 

Sample Input
1 + 2 4 + 2 * 5 - 7 / 11 0
 

Sample Output
3.00 13.36
 

Source
浙大计算机研究生复试上机考试-2006年
 

Recommend
JGShining   |   We have carefully selected several similar problems for you:  1230 1235 1234 1236 1229 
 

这个题困扰我几天了,看了别人的博客,这个方法太厉害了,居然不保存 字符数组

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>

#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define MID(x,y) ((x+y)>>1)

#define eps 1e-8
using namespace std;
#define N 10005

int main()
{
	int i;
	char c,cc;
	double a,b;

	while(~scanf("%lf%c",&a,&c))
	{
       if(fabs(a-0)<eps&&c=='\n')
		break;

		if(c=='\n')
		{
			printf("%.2lf\n",a);
			continue;
		}

	    stack<double>q;
	    q.push(a);

          scanf("%c%lf",&c,&a);
          if(c=='+')
		        q.push(a);
		   else
		      if(c=='-')
		        q.push(a*(-1));
		   else
		  {
			 double cur=q.top();
			 q.pop();
			 if(c=='*')
			  q.push(cur*a);
			 else
			  q.push(cur/a);
		  }

        while(scanf("%c",&c))
		{
			if(c=='\n') break;
			scanf("%c%lf",&c,&a) ;
			if(c=='+')
		        q.push(a);
		   else
		      if(c=='-')
		        q.push(a*(-1));
		   else
		  {
			 double cur=q.top();
			 q.pop();
			 if(c=='*')
			  q.push(cur*a);
			 else
			  q.push(cur/a);
		  }
		}

		double ans=0;
		while(!q.empty())
		{
			ans+=q.top();
			q.pop();
		}
       printf("%.2lf\n",ans);
	}
   return 0;

}



HDU 1237 简单计算器(stack)