hdu 1237 簡單計算機 (隊列)

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

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

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

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

Sample Output
3.00
13.36
 

Source

思路:

先將字符串的數字和符號分別存入兩個隊列中間,然後依次出隊。

代碼:

#include<iostream>
#include<sstream>
#include<string>
#include<queue>
#include<iomanip>
#include<stdlib.h>
using namespace std;
int flag;
char i;
double j,k;
string a,w;
queue<char>s;
queue<double>n;
bool is_num(string s)//判斷字符串是數字還是符號
{
    stringstream sin(s);
    char a;
    double b;
    if(!(sin>>b))
        return false;
    else
        return true;
}
char work(char a,char b)//判斷先進行什麼計算
{
    if(a=='+'||a=='-')
    {
        if(b=='+'||b=='-')
            return '=';
        else
            return '<';
    }
    else
    {
        if(b=='*'||b=='/')
            return '=';
        else
            return '>';
    }
}
double op(char i,double j,double k)//計算
{
    if(i=='+')
        return j+k;
    else if(i=='-')
        return j-k;
    else if(i=='*')
        return j*k;
    else
        return j/k;
}
int main()
{
    while(getline(cin,a)&&a!="0")
    {
        flag=0;
        stringstream ss(a);
        while(ss>>w)
        {
            if(is_num(w))
                n.push(atof(w.c_str()));
            else
            {
                i=w[0];
                s.push(i);
            }
        }
        s.push('+');
        s.push('+');
        n.push(0);
        n.push(0);
        j=n.front();
        n.pop();
        while(s.size()>1)
        {
            if(!flag)
            {
                i=s.front();
                s.pop();
                k=n.front();
                n.pop();
            }
            switch(work(i,s.front()))
            {
            case '=':
                flag=0;
                j=op(i,j,k);
                break;
            case '>':
                flag=0;
                j=op(i,j,k);
                break;
            case '<':
                flag=1;
                k=op(s.front(),k,n.front());
                s.pop();
                n.pop();
                break;
            }
        }
        cout<<setiosflags(ios::fixed)<<setprecision(2)<<j<<endl;//保留小數點後面兩位
    }
    return 0;
}


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