1. 程式人生 > >九度OJ 題目1019:簡單計算器

九度OJ 題目1019:簡單計算器

題目描述:
    讀入一個只包含 +, -, *, / 的非負整數計算表示式,計算該表示式的值。
輸入:
    測試輸入包含若干測試用例,每個測試用例佔一行,每行不超過200個字元,整數和運算子之間用一個空格分隔。沒有非法表示式。當一行中只有0時輸入結束,相應的結果不要輸出。
輸出:
    對每個測試用例輸出1行,即該表示式的值,精確到小數點後2位。
樣例輸入:
1 + 2
4 + 2 * 5 - 7 / 11
0
樣例輸出:
3.00
13.36
來源:

本題思路:

先計算乘除後計算加減。將數字依次存入棧中,遇到乘號則先相乘再存入棧中,遇到除號則相除再入棧,遇到減號則將數字存成負數入棧。

最後將棧內元素相加。

由於做的時候沒注意數字和運算子間有空格,導致WA,於是強行加了一行判斷空格。。。

# include <iostream>
# include <string.h>
# include <stdio.h>
# include <stack>
# include <stdlib.h>
using namespace std;
int main()
{
    char test[201],num[200],sym[4]={'*','/','+','-'};
    int len;
    stack<double> cal;
    while(cin.getline(test,201))
    {
        len = strlen(test);
        if(len==1&&test[0]=='0') break;
        int flag=2,count=-1;
        for(int i=0;i<len;i++)
        {
            int flag2=0;//幫助判斷是否是數字並存入num 
            if(test[i]==' ') continue;//沒注意題目中整數和運算子用空格分隔,去掉空格。 
            if(test[i]>='0'&&test[i]<='9')
            {
                count++;
                num[count]=test[i];
                flag2=1;
            }
            if(flag2==0||i==len-1)
            {
                num[count+1]='\0';
                double n = atoi(num);
                count=-1;
                if(flag==0) //乘法 相乘後放入棧 
                {
                    double m=cal.top();
                    n*=m;
                    cal.pop();
                    cal.push(n);
                }
                else if(flag==1) //除法  相除後放入棧 
                {
                    double m=cal.top();
                    n = m/n;
                    cal.pop();
                    cal.push(n);
                }
                else if(flag==3) //減法 存為負數放入棧 
                {
                    cal.push(-n);
                }
                else if(flag==2) //加法  直接放入棧 
                {
                    cal.push(n);
                } 
                for(int j =0;j<4;j++) //判斷算數符號 
                {
                    if(test[i]==sym[j]) flag=j;
                }     
            }
            
        }
        double alcount=0;
        while(cal.empty()!=1)//棧內剩餘數相加 
        {
            alcount+=cal.top();
            cal.pop();
        }    
        printf("%.2lf\n",alcount);  
         
    }
    return 0;
}
/**************************************************************
    Problem: 1019
    Language: C++
    Result: Accepted
    Time:0 ms
    Memory:1524 kb
****************************************************************/