簡單計算器

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;  
}  



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章