讀入一個只包含 +, -, *, / 的非負整數(shù)計算表達式,計算該表達式的值。
Input
測試輸入包含若干測試用例,每個測試用例占一行,每行不超過200個字符,整數(shù)和運算符之間用一個空格分隔。沒有非法表達式。當一行中只有0時輸入結(jié)束,相應的結(jié)果不要輸出。
Output
對每個測試用例輸出1行,即該表達式的值,精確到小數(shù)點后2位。
Sample Input
1 + 2
4 + 2 * 5 - 7 / 11
0
Sample Output
3.00
13.36
中綴表達式轉(zhuǎn)后綴表達式然后求值 具體步驟可以參考http://www.lxweimin.com/p/d7df4812a981
#include <iostream>
#include <cstdio>
#include <cstring>
#include<stack>
using namespace std;
int P(char c)
{
if (c == '+' || c == '-') return 1;
return 2;
}
double Ans(double x, double y, char c)
{
if (c == '+') return x + y;
if (c == '-') return x - y;
if (c == '*')return x*y;
return x / y;
}
int main() {
int n;
while (scanf("%d",&n)!=EOF)
{
char c = getchar();
if (c=='\n'&&n == 0)break;
stack<char> op;
stack<double>num;
num.push(n);
while (true)
{
scanf("%c %d", &c, &n);
char k = getchar();
while (!op.empty()&&P(c)<=P(op.top()))
{
char t = op.top();
op.pop();
double y = num.top();
num.pop();
double x = num.top();
num.pop();
double ans = Ans(x, y, t);
num.push(ans);
}
op.push(c);
num.push(n);
if (k == '\n')break;
}
while (!op.empty())
{
char t = op.top();
op.pop();
double y = num.top();
num.pop();
double x = num.top();
num.pop();
double ans = Ans(x, y, t);
num.push(ans);
}
printf("%.2f\n", num.top());
}
return 0;
}