hdu 1237 简单计算器

简单计算器

题目链接:点击打开链接

题目分析:这道题的重点是:运算符的优先级,先确定运算符的优先级,然后根据优先级计算。定义两个栈,分别存储数字,和运算符。

                   也是栈的简单应用吧。

                注意:1、数字不只是单位数字,还有可能是多位。

                            2、注意输入0 + 0返回0.00 ,但是输入0,结束。


源代码:

#include<iostream>
#include<string.h>
#include<stack>
using namespace std;

char Precede(char a,char b)	//比较运算符的优先级
{
	if(a=='+'||a=='-')
	{
		switch(b)
		{
			case '+':
			case '-':return '>';break;
			case '*':
			case '/':return '<';break;
		}
	}
	if(a=='*'||b=='/')
		return '>';
} 

double operate(double a,char c,double b)	//运算
{
	switch(c)
	{
		case '+':return(a+b);break;
		case'-':return(a-b);break;
		case'*':return(a*b);break;
		case'/':return(a/b);break;
	}
} 

int main()
{
	stack<double>opnd;	//存放数字 
	stack<char>optr;	//存放运算符 
	//string s;
	char s[205];
	char theta,c;
	int i,k;
	double a,b;
	//while(getline(cin,s),s!="0")
	while(gets(s))
	{
		int l=strlen(s);
		if(l==1&&s[0]=='0')	//注意0 + 0 = 0.00
			break;
		opnd.push(s[0]-48);	//因为s为字符型的,s[0]-48 将字符转化为数字 
		i=0;
		c=s[++i];	 
		while(c!='\0')	//表达式不结束 
		{
			if(c==' ')
			{
				c=s[++i];
				continue;
			}
			if(c>='0'&&c<='9')
			{
				if(s[i-1]>='0'&&s[i-1]<='9')	//注意,如若是像32这样连续数字的
				{
					a=opnd.top()*10+c-48;
					opnd.pop();
					opnd.push(a);
				} 
				else
					opnd.push(c-48);
				c=s[++i];
			}
			else
			{
				if(!optr.empty())
				{
					switch(Precede(optr.top(),c))	//重点: 运算符的优先级
					{
						case'<':optr.push(c);
								c=s[++i];
								break;
						case'>':theta=optr.top();	//此处进行运算,并没有进栈。
								optr.pop();	//只有前面字符的优先级高才运算
								a=opnd.top();
								opnd.pop();
								b=opnd.top();
								opnd.pop();
								opnd.push(operate(b,theta,a));	//计算并进栈 
								break; 
								 
					} 
				}
				else
				{
					optr.push(c);
					c=s[++i];
				}
			}
		}
		
		while(!optr.empty())	//因为是先输入数字,所以可能有余下的运算符没有处理
		{
			theta=optr.top();
			optr.pop();
			a=opnd.top();
			opnd.pop();
			b=opnd.top();
			opnd.pop();
			opnd.push(operate(b,theta,a));
		} 
		printf("%.2lf\n",opnd.top());
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值