模拟四则运算过程,对于整个输入的串,
遇到数字则提取出来进数字栈,
遇到加减运算则进运算符栈,
遇到乘除运算则从数字栈中拿出栈顶元素与运算符之后提取出的整数进行运算并将结果进数字栈,
这样当枚举完整个串的元素后,我们就得到了一个只有加减运算的表达式,但因为这个表达式在栈中的顺序是反的,所以要再开两个栈来将这个表达式反序,之后就每次从数字栈栈顶取出两元素,从运算符栈中取出一个运算符,将运算结果压进数字栈中,最后数字栈剩下的一个元素即为表达式的最终结果 。
#include<cstdio>
#include<cstring>#include<iostream>
#include<stack>
using namespace std;
int main()
{
char s[250];
while(gets(s)&&strcmp(s,"0"))
{
int len=strlen(s);
int i,j;
stack<double>num;//存储整数
stack<char>op;//存储运算符
for(i=0;i<len;i++)//遍历字符串开始处理
{
if(s[i]==' ')//空格直接跳过
continue;
else if(s[i]=='*'||s[i]=='/')//乘法除法运算符,运算完后将结果入栈
{
double x=num.top();//拿出数字栈中的栈顶元素
num.pop();
double y=0;
for(j=i+2;j<len;j++)//提取出字符串中的整数
{
if(s[j]!=' ')
y=y*10+s[j]-'0';
else
break;
}
if(s[i]=='*')
num.push(x*y);
else
num.push(x/y);
i=j;//更新遍历字符串的位置
}
else if(s[i]=='+'||s[i]=='-')//加法减法运算符,先进栈
op.push(s[i]);
else//提取数字进数字栈
{
double y=0;
for(j=i;j<len;j++)
{
if(s[j]!=' ')
y=y*10+s[j]-'0';
else
break;
}
i=j;
num.push(y);
}
}
//因为进栈之后出栈顺序与运算顺序相反,所以要将栈内元素反转
stack<double>num2;
stack<char>op2;
while(!num.empty())
{
double temp=num.top();
num2.push(temp);
num.pop();
}
while(!op.empty())
{
char temp=op.top();
op2.push(temp);
op.pop();
}
while(!num2.empty()&&!op2.empty())
{
double x=num2.top();//拿出第一个整数
num2.pop();
double y=num2.top();//拿出第二个整数
num2.pop();
char optemp=op2.top();
op2.pop();
if(optemp=='+')
num2.push(x+y);
else
num2.push(x-y);
}
printf("%.2lf\n",num2.top());
num2.pop();
}
return 0;
}