题目:
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
Input
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
Output
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
Sample Input
1 + 2
4 + 2 * 5 - 7 / 11
0
Sample Output
3.00
13.36
解题思路:
使用栈来实现,将中缀表达式转换为后缀表达式。
转换规则如下:
1,如果是数字直接输出(输出到栈中)
2,如果是运算符号则判断其与栈顶的优先级,是右括号或优先级不高于栈顶符号则
栈顶元素依次出栈输出,并将当前符号进栈。
代码:
#include<iostream>
#include<stack>
#include<string.h>
#include<stdio.h>
using namespace std;
int Rank(char a)
{
if(a=='(')
return 4;
else if(a=='*' || a=='/')
return 3;
else if(a=='+' || a=='-')
return 2;
return 0;
}//优先级,左括号最高,乘除高于加减
int main()
{
stack<double>data;
stack<char> point;
char a[201];
int i,t;
while(gets(a)!=NULL && strcmp("0",a))
{
i=t=0;
while(a[i] || !point.empty())
{
if(a[i]==' ')
i++;
else if(a[i]>='0' && a[i]<='9')//如果是数字直接输出到名为data的栈中
{
t=t*10+a[i]-'0';
i++;
if(!(a[i]>='0' && a[i]<='9'))
{
data.push(t);
t=0;
}
}
else if(point.empty() || Rank(a[i])>Rank(point.top())||point.top()=='('&& a[i]!=')')//如果运算符(point)栈为空,无需后面的比较直接入栈,
{ //或者当前运算符优先级大于栈顶运算符优先级入栈
point.push(a[i]); //如果入栈了一个左括号,则下一个运算符无需比较优先级直接入栈
i++;
}
else if(point.top()=='(' && a[i]==')')
{
point.pop();
i++;
}
else //其他情况为两个数字进行运算
{
double fir,sec;
switch(point.top())
{
case '+' :
{
fir=data.top();
data.pop();
sec=data.top();
data.pop();
data.push(fir+sec);
}
break;
case '-' :
{
fir=data.top();
data.pop();
sec=data.top();
data.pop();
data.push(sec-fir);
}
break;
case '*':
{
fir=data.top();
data.pop();
sec=data.top();
data.pop();
data.push(fir*sec);
}
break;
case '/':
{
fir=data.top();
data.pop();
sec=data.top();
data.pop();
data.push(sec/fir);
}
break;
}
point.pop();
}
}
printf("%.2f\n",data.top());
}
return 0;
}