问题:读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值并写出算法。
回答:
#include<iostream>
#include<stack>
#include<string>
using namespace std;
char Precede(char a,char b);
double operate(double a1,char c,double b1);
int main()
{
stack<double> opnd;
stack<char> optr;
string s;
char theta,c;
int i,k;
double a,b;
while(getline(cin,s),s!="0")
{
opnd.push(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()!=true)
{
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()!=true)//因为我先输入数字,可能最后剩下运算符没有处理
{
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;
}
char Precede(char a,char b)//比较运算符的优先级
{
if(a==‘+‘||a==‘-‘)
{
switch(b)
{
case ‘+‘:
case ‘-‘:return ‘>‘;break;
case ‘*‘:
case ‘/‘:return ‘<‘;break;
}
}
if(a==‘*‘||a==‘/‘)
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;
}
}