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;
}


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