1. 程式人生 > >hdu1237簡單計算器解題報告---stack棧模擬實現

hdu1237簡單計算器解題報告---stack棧模擬實現

                                               簡單計算器

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

Problem Description

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

Input

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

Output

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

Sample Input

1 + 2

4 + 2 * 5 - 7 / 11

0

Sample Output

3.00

13.36

思路:計算器的運算優先順序用棧來實現最適合不過了,只要在入棧之前控制好

* / + -這樣的優先順序順序,getchar來讀入每個運算子以及吃掉空格即可。

AC Code:

/*
  Problem : 1237 ( 簡單計算器 )     Judge Status : Accepted
  RunId : 27199222    Language : G++    Author : html_11
*/
#include<iostream>
#include<sstream>
#include<cstdlib>
#include<cmath>
#include<cctype>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<map>
#include<vector>
#include<stack>
#include<queue>
#include<set>
#include<list>
#define mod 998244353
#define INF 0x3f3f3f3f
#define Min 0xc0c0c0c0
#define mst(a) memset(a,0,sizeof(a))
#define f(i,a,b) for(int i=a;i<b;i++)
using namespace std;
typedef long long ll;
const int maxn = 1e6 + 5;
stack<double>s;
int main(){
    int n;
    double m;
    while(scanf("%d", &n) != EOF){
        char c = getchar();
        if(c == '\n' && n == 0) break;
        s.push(n);
        c = getchar();
        while(scanf("%d", &n) != EOF){
            if(c == '*'){
                m = s.top();
                m *= n;
                s.pop();    //這裡要記得出棧
                s.push(m);
            }
            else if(c == '/'){
                m = s.top();
                m /= n;
                s.pop();  //這裡記得出棧
                s.push(m);
            }
            else if(c == '+'){
                s.push(n);
            }
            else if(c == '-'){
                s.push(0 - n);
            }
            c = getchar();
            if(c == '\n') break;
            c = getchar();
        }
        double res = 0;
        while(!s.empty()){
            res += s.top();
            s.pop();        //棧要清空:細節
        }
        printf("%.2lf\n", res);
    }
    return 0;
}