简单计算器
题目链接:点击打开链接
题目分析:这道题的重点是:运算符的优先级,先确定运算符的优先级,然后根据优先级计算。定义两个栈,分别存储数字,和运算符。
也是栈的简单应用吧。
注意: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;
}