8.1.3 簡單計算器

簡單計算器

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 58 Accepted Submission(s): 44

Problem Description
讀入一個只包含 +, -, *, / 的非負整數計算表達式,計算該表達式的值。
 

Input
測試輸入包含若干測試用例,每一個測試用例佔一行,每行不超過200個字符,整數和運算符之間用一個空格分隔。沒有非法表達式。當一行中只有0時輸入結束,相應的結果不要輸出。
 

Output

            對每一個測試用例輸出1行,即該表達式的值,精確到小數點後2位。
 

Sample Input
1 + 2
4 + 2 * 5 - 7 / 11
0
 

Sample Output
3.00
13.36

ios

  1 //不是個人代碼
  2 #include "iostream"
  3 #include "stdio.h"
  4 #include "math.h"
  5 #include "vector"
  6 #include "stack"
  7 #include "queue"
  8 #include "memory.h"
  9 #include "algorithm"
 10 #include "string"
 11 using namespace std;
 12 
 13 char e[250],post[250];
 14 stack<char>Op;
 15 
 16 bool Isnum(char c)
 17 {
 18     if(c>='0'&&c<='9')
 19         return true;
 20     return false;
 21 }
 22 
 23 int OPMode(char c)
 24 {
 25     if(c=='+')        return 1;
 26     if(c=='-')        return 2;
 27     if(c=='*')        return 3;
 28     if(c=='/')        return 4;
 29     return -1;
 30 }
 31 
 32 void SplitExp(char* s)
 33 {
 34     int i,j=0;
 35     memset(post,'\0',sizeof(post));
 36     for(i=0;i<strlen(s);i++)
 37     {
 38         if(s[i]==' ')
 39             continue;
 40         post[j++]=' ';
 41         while(Isnum(s[i]))
 42             post[j++]=s[i++];
 43         int curop=OPMode(s[i]);
 44         if(curop!=-1)
 45         {
 46             if(curop<=2)
 47                 while(!Op.empty())
 48                 {
 49                     post[j++]=Op.top();
 50                     Op.pop();
 51                 }
 52             else
 53             {
 54                 while(!Op.empty()&&OPMode(Op.top())>2)
 55                 {
 56                     post[j++]=Op.top();
 57                     Op.pop();
 58                 }
 59             }
 60             Op.push(s[i])    ;
 61         }
 62     }
 63     while(!Op.empty())
 64     {
 65         post[j++]=Op.top();
 66         Op.pop();
 67     }
 68 }
 69 
 70 stack<double>Num;
 71 double Cal()
 72 {
 73     while(!Num.empty())
 74         Num.pop();
 75     int i=0,j;
 76     int len=strlen(post);
 77     while (i++<len)
 78     {
 79         if(post[i]==' ')
 80             continue;
 81         double cur=0;
 82         bool hasnum=false;
 83         while (Isnum(post[i]))
 84         {
 85             cur*=10;
 86             cur+=post[i++]-'0';
 87             hasnum=true;
 88         }
 89         if(hasnum)
 90             Num.push(cur);
 91         if(OPMode(post[i])!=-1)
 92         {
 93             double num1=Num.top();
 94             Num.pop();
 95             double num2=Num.top();
 96             Num.pop();
 97             switch(post[i])
 98             {
 99             case '+':        Num.push(num2+num1);break;
100             case '-':        Num.push(num2-num1);break;
101             case '*':        Num.push(num2*num1);break;
102             case '/':        Num.push(num2/num1);break;
103             }
104         }
105     }
106     return Num.top();
107 }
108 
109 int main()
110 {
111     while(gets(e))
112     {
113         if(strcmp(e,"0")==0)
114             break;
115         SplitExp(e);
116         printf("%.2f\n",Cal());
117     }
118 }
相關文章
相關標籤/搜索