首页 > 代码库 > HDU 1237

HDU 1237

简单计算器

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 13316    Accepted Submission(s): 4385


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年

 

做了这道题我发现那些能编写计算器的人简直屌爆了。。

卡了我一天的题目,还只是简单的简算,还没用到任何函数,对数,根号运算。

上代码吧。我的思想就是用栈做。先将第一个数推进栈,然后不断的进栈,出栈,运算。

#include <stdio.h>
#include <stack>
#include <algorithm>
using namespace std;
int main()
{
	double n,m;
	char c;
	while(~scanf("%lf",&n))   //首先输入一个数
	{
		c=getchar();   //  从键盘上得到一个字符,可以使空格也可以使回车。
		if(c=='\n' &&n==0)     //如果N为0并且直接回车的话按题目说的结束程序。
			break;
		stack<double>s;   //   将double 类型的建立栈
		s.push(n);    //    将第一个数推进栈
		scanf("%c",&c);  //     开始输入一个字符
		while(~scanf("%lf",&n))   //继续输入一个数
		{ 
			if(c=='*')   //  如果字符为乘号
			{
				m=s.top();//  令m等于栈首元素(可理解为第一个数)
				m*=n;//       m* n为它们的结果
				s.pop();//   此时清空栈
				s.push(m);  //   将m推进栈。
			}
			if(c=='/')
			{
				m=s.top();  
				m/=n;
				s.pop();
				s.push(m);//   以上同上
			}
			if(c=='+')
				s.push(n);//  直接推进栈
			if(c=='-')
				s.push(0-n);//  直接推进栈
			if(getchar()=='\n')
				break;//   一旦遇到回车直接跳出
			c=getchar();//  反复输入符号
		}
		double sum=0;
		while(!s.empty())  //如果有加号,或者减号,说明栈是不空的,因为有元素被推进去了
		{
			sum+=s.top();//  不断的加上栈首元素。
			s.pop();  //不断的弹栈,直到栈空为止。
		}
		printf("%.2lf\n",sum);//sum的值即为整个表达式最终的值了。
	}
	return 0;
}


 

 

HDU 1237