hdu 1237&&九度oj 1019 简单计算器

题目描述:
    读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
输入:
    测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
输出:
    对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
样例输入:
1 + 2
4 + 2 * 5 - 7 / 11
0
样例输出:
3.00

13.36


1.数字与操作符之间有空格

2.判断算符优先级

3.输出格式

#include 
#include 
#include 
#include 
using namespace std;
int main()
{
	stack s1;//操作数栈
	stack s2;//操作符栈
	double first,second;//第一操作数和第二操作数
	int num;//数字
	char op;//操作符
	double data[1005];//操作数数组
	char operate[1005];//操作符数组
	while(cin>>num)
	{
		op=getchar();//读取数字后输入的字符
		if(num==0&&op=='\n')
			break;
		s1.push(num);
		while(op==' ')//数字与操作符之间有空格
		{
			op=getchar();//读取空格后的操作符
			if(op=='\n')
				break;
			if(!s2.empty()&&(s2.top()=='*'||s2.top()=='/'))
			{
				second=s1.top();
				s1.pop();
				first=s1.top();
				s1.pop();
				if(s2.top()=='*')
					s1.push(first*second);
				if(s2.top()=='/')
					s1.push(first/second);
				s2.pop();
			}
			s2.push(op);
			cin>>num;
			s1.push(num);
			op=getchar();
		}
		if(s2.top()=='*'||s2.top()=='/')
		{
			second=s1.top();
			s1.pop();
			first=s1.top();
			s1.pop();
			if(s2.top()=='*')
				s1.push(first*second);
			else if(s2.top()=='/')
				s1.push(first/second);
			s2.pop();
		}
		//保存到操作数数组和操作符数组中,按逆序运算
		int datalen,oplen;
		int datatop,optop;
		int i=0;
		while(!s1.empty())
		{
			data[i++]=s1.top();
			s1.pop();
		}
		datalen=i;
		datatop=i-1;
		int j=0;
		while(!s2.empty())
		{
			operate[j++]=s2.top();
			s2.pop();
		}
		oplen=j;
		optop=j-1;
		for(int k=optop;k>=0;--k)
		{
			if(operate[k]=='+')
			{
				data[datatop-1]=data[datatop]+data[datatop-1];
				datatop--;
			}
			else if(operate[k]=='-')
			{
				data[datatop-1]=data[datatop]-data[datatop-1];
				datatop--;
			}
		}
		cout<


你可能感兴趣的:(水题,字符串,栈)