您的位置:首页 > 其它

hdu 1237 简单计算器

2014-11-14 20:27 323 查看

简单计算器

题目链接:点击打开链接

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

也是栈的简单应用吧。

注意: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: