Problem Description
讀入一個只包含 +, -, *, / 的非負整數計算表達式,計算該表達式的值。
Input
測試輸入包含若干測試用例,每個測試用例佔一行,每行不超過200個字符,整數和運算符之間用一個空格分隔。沒有非法表達式。當一行中只有0時輸入結束,相應的結果不要輸出。
Output
對每個測試用例輸出1行,即該表達式的值,精確到小數點後2位。
Sample Input
1 + 2
4 + 2 * 5 - 7 / 11
0
Sample Output
3.00
13.36
<<<源代碼>>>
#include<stdio.h>
#include<string.h>
#include<stack>
using namespace std;
stack <double> N; //操作數棧
stack <char> O;//操作符棧
double calcul(char oper)//雙目運算符
{
double a = N.top(), b;
N.pop();
b = N.top();
N.pop();
switch(oper){
case '+':
return b + a;//加法
case '-':
return b - a;//減法
case '*':
return b * a;//乘法
case '/':
return b / a;//除法
}
}
int main()
{
int len, i; //表達式長度,計數器,數字轉換時記錄小數位
double num, a, b;
char s[210], oper; //表達式,操作符
while (gets(s)){ //讀入一行表達式
len = strlen(s); //計算出表達式的長度
if (len == 1 && s[0] == '0') //控制整個程序的結束
break;
i = 0;
while (i < len){ //邊讀入邊計算 控制一系列操作的結束
num = 0;
while (s[i] == ' ') //主要作用是鏈接下一次的循環,因爲操作符後面一定是操作數
i++;
//while (((s[i] >= '0' && s[i] <= '9') || s[i] == '.')&& i < len)
while (s[i] >= '0' && s[i] <= '9' && i < len)
{ //將數字由字符型轉換爲整型
num = num * 10 + s[i] - '0';
i++;
}
N.push(num);//將轉換後的數字壓入操作數棧
while (s[i] == ' ') //說明輸入的數字結束,後面肯定會是操作符,
i++;
switch (s[i])
{ //處理操作符
case '+':
case '-'://如果操作符爲優先級最低的加減
while (!O.empty())
{ //比此操作符優先級高或者相等,此題中所有操作符都符合此條件,略去
oper = O.top();//彈出棧頂操作符
O.pop();
N.push(calcul(oper));//將結果壓入堆棧
}
O.push(s[i]); break;
case '*' :
case '/' : //如果操作符爲優先級第一的乘除
while (!O.empty() && (O.top() == '*' || O.top() == '/'))
{ //比此操作符優先級高或者相等
oper = O.top();//彈出棧頂操作符
O.pop();
N.push(calcul(oper));//將結果壓入堆棧
}
O.push(s[i]); break;
default : break;
}
i++;
}
while (!O.empty()){//比將所有的操作符退棧運算
oper = O.top();
O.pop();
N.push(calcul(oper));
}
printf("%.2lf\n", N.top());//打印最終結果
N.pop();
}
return 0;
}