jobdu 27 简单计算器

题目描述:
    读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
输入:
    测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
输出:
    对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
样例输入:
1 + 2
4 + 2 * 5 - 7 / 11
0
样例输出:
3.00
13.36
#include <stdio.h>
#include <string.h>
#include <stack>
using namespace std;
int main()
{
	int i;
	double a,b;
	char s[250],c;
	while(gets(s),strcmp(s,"0")!=0)
	{
		stack<char> s1;
		stack<double> s2;
		for(i=0;s[i];i++)
		{
			if(s[i]>='0'&&s[i]<='9')
			{
				a=0;
				while(s[i]>='0'&&s[i]<='9')
				{
					a=a*10+s[i]-'0';
					i++;
				}
				i--;
				s2.push(a);
			}
			else if(s[i]=='-'||s[i]=='+')
			{
				if(!s1.empty())
				{
					c=s1.top();
					s1.pop();
					a=s2.top();
					s2.pop();
					b=s2.top();
					s2.pop();
					if(c=='+')
						a+=b;
					else
						a=b-a;
					s2.push(a);
					s1.push(s[i]);
				}
				else
					s1.push(s[i]);
			}
			else if(s[i]=='*')
			{
				b=0;
				i+=2;
				while(s[i]>='0'&&s[i]<='9')
				{
					b=b*10+s[i]-'0';
					i++;
				}
				i--;
				a=s2.top();
				s2.pop();
				a*=b;
				s2.push(a);
			}
			else if(s[i]=='/')
			{
				b=0;
				i+=2;
				while(s[i]>='0'&&s[i]<='9')
				{
					b=b*10+s[i]-'0';
					i++;
				}
				i--;
				a=s2.top();
				s2.pop();
				a/=b;
				s2.push(a);
			}
		}
		while(!s1.empty())
		{
			c=s1.top();
			s1.pop();
			a=s2.top();
			s2.pop();
			b=s2.top();
			s2.pop();
			if(c=='+')
				a+=b;
			else
				a=b-a;
			s2.push(a);
		}
		printf("%.2lf\n",s2.top());
	}
	return 0;
}

你可能感兴趣的:(jobdu 27 简单计算器)