簡易計算機HDU 1237

8497 ワード

簡易電卓Time Limit:2000/1000 MS(Java/others)Memory Limit:65536/32768 K(Java/others)Total Submission(s):14384 Accepted Submission(s):4861
Problem Description
+、-、*、/のみを含む非負の整数計算式を読み込み、その値を計算します.
Input
テスト入力には、各テスト・インスタンスが1行を占め、各行が200文字を超えず、整数と演算子の間にスペースで区切られたいくつかのテスト・インスタンスが含まれます.不正な式はありません.1行に0しかない場合は入力が終了し、対応する結果は出力されません.
Output
各テストケースに1行、すなわち式の値を小数点以下2桁まで出力します.
Sample Input
1 + 2 4 + 2 * 5 - 7/11 0
Sample Output
3.00 13.36
構想:文字列は1行のデータを読み込む;1、文字列の末尾から逆さまにデータをそれぞれデジタルスタックとオペレータスタックに押し込む(10進数変換時のデータの処理に注意、逆さまに読むので少し面倒です.)2、1つのオペレータと2つのオペレータを取り出す3、比較的に取り出すオペレータとスタックの一番上のオペレータの優先度、取り出すオペレータが大きいと、演算子は、結果をデジタルスタックに戻す.4、スタックトップのオペレータの優先度が大きい場合、オペレータスタックトップオペレータとデジタルスタックトップのデータを取り出し、まず2番目のオペレータを演算し、結果をデータスタックに戻し、最初の操作数とオペレータをそれぞれデータと操作スタックに戻す.5.スタックが空になるまで、上記2、3、4の手順を繰り返します.結果を出力します.
最初はずっとwaで、他の人のコードを见るのが长すぎて、第1版のコードは长く干して、昨日出して10進数の処理の过程を直して、データのタイプをdoubleに変えて、ついにACになりました.の
/* bug——            00000...    0,         *    ,        。。。 */
#include <iostream>
#include <stack>
#include <string.h>
#include <cstdio>

using namespace std;
char inputs[201];

int judge(char c)
//      
{
    if(c >= '0' && c <= '9') return 1;
    else if(c == '+' || c == '-') return 2;
    //        ,              
    else if(c == '*' || c =='/' ) return 3;
    else  return 0;
}

double cacul(double i,char c,double j)
//  
{
    double sum;
    switch (c)
    {
    case '+':
        sum = i + j;
        break;
    case '-':
        sum = i - j;
        break;
    case '*':
        sum = i * j;
        break;
    case '/':
        sum = i / j;
        break;
    }
    return sum;
}

int main()
{
    double  sum = 0,n1,n2,n3;
    //   double     ,float      ,    float WA 
    char op1,op2;
    int len,i,j,flag,k;

    gets(inputs);
    len = strlen(inputs);
    while(len != 1  || inputs[0] != '0')
    {
        j =0;
        i = len;
        stack<char> stOperator;
        stack<double> stNumber;

        flag = k = 0;
        //flag             ,k        

        while(i >= 0)
            //    ,            
        {
            if(judge(inputs[i]) == 1)
                //       ,      
            {
                int l = inputs[i] - '0';

                for(j = 0;j < flag;j++)
                 //        ,                ,          
                    l = l * 10;

                k += l;
                flag++;
            }
            else if(judge(inputs[i]) >= 2)//       ,              
            {
                stNumber.push(k);
                //      
                flag = 0;
                //   0
                stOperator.push(inputs[i]);
                //     
                k = 0;
            }
            i--;
        }

        stNumber.push(k);
        //          

    while(!stNumber.empty() && !stOperator.empty())
        //        ,        
        {
            op1 = stOperator.top();
            stOperator.pop();
           //         

            if(!stOperator.empty())op2 = stOperator.top();
            //                  
            else op2 ='\0';
            //  op2      

             n1 = stNumber.top();
            stNumber.pop();
            //        

             n2 = stNumber.top();
            stNumber.pop();
            //        


            if( judge(op2) > judge(op1))
            //             
            {
                 n3 = stNumber.top();
                 stNumber.pop();
                //        
                sum = cacul(n2,op2,n3);
                //          
                stNumber.push(sum);
                //         
                stNumber.push(n1);
               //           
                stOperator.pop();
                //           ,                 
                stOperator.push(op1);
                //        
            }
            else//       
            {
                sum = cacul(n1,op1,n2);
                //        
                stNumber.push(sum);
                //    
            }
        }
        printf("%.2f
"
,sum); gets(inputs); len = strlen(inputs); } return 0; }