1. 程式人生 > >nyoj 題目35 表示式求值

nyoj 題目35 表示式求值

                                                                      表示式求值

時間限制:3000 ms  |            記憶體限制:65535 KB 難度:4
描述
ACM隊的mdd想做一個計算器,但是,他要做的不僅僅是一計算一個A+B的計算器,他想實現隨便輸入一個表示式都能求出它的值的計算器,現在請你幫助他來實現這個計算器吧。
比如輸入:“1+2/4=”,程式就輸出1.50(結果保留兩位小數)
輸入
第一行輸入一個整數n,共有n組測試資料(n<10)。
每組測試資料只有一行,是一個長度不超過1000的字串,表示這個運算式,每個運算式都是以“=”結束。這個表示式裡只包含+-*/與小括號這幾種符號。其中小括號可以巢狀使用。資料保證輸入的運算元中不會出現負數。
資料保證除數不會為0
輸出
每組都輸出該組運算式的運算結果,輸出結果保留兩位小數。
樣例輸入
2
1.000+2/4=
((1+2)*5+1)/4=
樣例輸出
1.50
4.00
來源
上傳者
張雲聰

解法:先求出字尾表示式(逆波蘭式),然後計算(棧+stringstream)!

#include<bits/stdc++.h>
using namespace std;
string s,str;
int yxj(char ch)
{
    switch(ch)
    {
        case '+':
        case '-':return 1;
        case '*':
        case '/':return 2;
        default: return 0;
    }
}
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        cin>>s;
        stack<char>pq;
        stack<double>qp;
        pq.push('#');
        int len=s.size(),i=0;
        str.clear();
        while(i<len-1)
        {
            if(s[i]=='(')
            {
                pq.push(s[i]);
                i++;
            }
            else if(s[i]==')')
            {
                while(pq.top()!='(')
                {
                    str+=pq.top();
                    pq.pop();
                    str+=' ';
                }
                pq.pop();
                i++;
            }
            else if(s[i]=='+'||s[i]=='-'||s[i]=='*'|s[i]=='/')
            {
                while(yxj(pq.top())>=yxj(s[i]))
                {
                    str+=pq.top();
                    str+=' ';
                    pq.pop();
                }
                pq.push(s[i]);
                i++;
            }
            else
            {
                while(s[i]>='0'&&s[i]<='9'||s[i]=='.')
                {
                    str+=s[i];
                    i++;
                }
                str+=' ';
            }
        }
        while(pq.top()!='#')
        {
            str+=pq.top();
            pq.pop();
            str+=' ';
        }
        stringstream ss(str);
        string buf;
        while(ss>>buf)
        {
            if(isdigit(buf[0]))
            {
                char a[100];
                double num;
                int i=0;
                for(i=0;i<buf.size();i++)
                    a[i]=buf[i];
                a[i]='\0';
                num=atof(a);
                qp.push(num);
            }
            else
            {
                double x=qp.top();
                qp.pop();
                double y=qp.top();
                qp.pop();
                if(buf=="+")
                    qp.push(y+x);
                else if(buf=="-")
                    qp.push(y-x);
                else if(buf=="*")
                    qp.push(y*x);
                else if(buf=="/")
                    qp.push(y/x);
            }
        }
        printf("%.2lf\n",qp.top());
    }
    return 0;
}