题目:
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
Input测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
Output对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
Sample Input
1 + 2
4 + 2 * 5 - 7 / 11
0
Sample Output
3.00
13.36 解题思路:
虽然用数组也可以解决这一类题,但在这里我使用栈来解答这一题。
显然这是一个模拟题。首先把数字和符号分别放入栈中;
计算部分首先计算乘除法,并把计算的结果放入栈内,如果遇到加减号则把数字和符号分别放入另一个栈中
此时另一个栈中就只有加减法,再计算加减法,得到计算结果。(注意计算顺序)
#include <iostream>
#include<stack>
#include<queue>
#include<cstring>
#include<cstdio>
using namespace std; int main()
{
int i,j,h,g=,d,b,q;
double ans,x1,x2,k;
char a[];
while ()
{
memset(a,,sizeof(a));
k=;h=;ans=;d=,b=;g=;
gets(a);
if (strlen(a)==&&a[]=='')break;
stack<char>f,f2;
stack<double>s,s2;
queue<char>f1;
queue<double>s1;
for (i=;i<strlen(a);i++)
{
if (a[i]==' '){h++;continue;} //分离数字和符号
else
{
if (h%!=){f.push(a[i]);s.push(k);k=;d++;continue;}
if (h%==){k=k*+(a[i]-'');}
}
}
s2.push(k);
q=d;
while (q--) //导入另一个栈内使计算顺序正确(栈是后进先出)
{
s2.push(s.top());s.pop();
f2.push(f.top());f.pop();
}
while (d--)
{
g=;
if (f2.top()=='+'||f2.top()=='-') //把加减法放入另一个队列
{
f1.push(f2.top());
s1.push(s2.top());
f2.pop();
s2.pop();
b++;continue;
}
if (f2.top()=='*') //计算乘除法
{
x1=s2.top();s2.pop();
x2=s2.top();s2.pop();
s2.push(x1*x2);
f2.pop();continue;
}
if (f2.top()=='/')
{
x1=s2.top();s2.pop();
x2=s2.top();s2.pop();
s2.push(x1/x2);
f2.pop();continue;
}
}
s1.push(s2.top());
ans+=s1.front();s1.pop();
while (b--)
{
if (f1.front()=='+') //计算加减法
{
ans+=s1.front();
s1.pop();
f1.pop();continue;
}
if (f1.front()=='-')
{
ans-=s1.front();
s1.pop();
f1.pop();continue;
}
}
if (g==)printf("%0.2lf\n",ans); //g==1用来控制格式(可以去掉)
}
return ;
}