1. 程式人生 > >排程場演算法-表示式計算

排程場演算法-表示式計算

也不是什麼新的東西把,排程場也不說了,就說說我寫過的三個版本表示式的成長吧

第一個簡單計算器,沒有括號沒有單獨考慮加減乘除優先順序

第二個等價表示式主要是沒有值吧,全代固定變數,然後沒有除法

列出來:

[1]簡單計算器:字串處理之簡單計算器

[2]等價表示式:轉逆波蘭表示式-OpenJudge[等價表示式]

慢慢填坑,這個表示式計算用到 [1]的擷取浮點數方法,加上[2]的轉逆波蘭及逆波蘭表示式求值,直接貼程式碼了

#include<bits/stdc++.h>
using namespace std;

void Tranfer_Equal(string Init_Equal,string& Equal,queue<double>& Num_Que)
{
    stack<char> Signal;

    int i=0;
    int Point_Flag=0;
    int Pow=10;
    double Number=0;

    while(Init_Equal[i]!='#')
    {
        if((Init_Equal[i]>='0'&&Init_Equal[i]<='9')||Init_Equal[i]=='.')
        {
            if(Init_Equal[i]=='.')
            {
                Point_Flag=1;
                Pow=10;
                i++;
                continue;
            }
            if(Point_Flag)
            {
                Number+=((Init_Equal[i]-'0')*1.0)/Pow;
                Pow*=10;
            }
            else
                Number=Number*10+(Init_Equal[i]-'0');

            if((Init_Equal[i+1]>'9'||Init_Equal[i+1]<'0')&&Init_Equal[i+1]!='.')
            {
                Equal+='?';
                Num_Que.push(Number);
                Number=0;
                Pow=10;
                Point_Flag=0;
            }
        }
        else if(Init_Equal[i]=='(')
        {
            Signal.push(Init_Equal[i]);
        }
        else if(Init_Equal[i]==')')
        {
            while(Signal.top()!='(')
            {
                Equal+=Signal.top();
                Signal.pop();
            }
            Signal.pop();
        }
        else if(Init_Equal[i]=='+'||Init_Equal[i]=='-')
        {
            while(!Signal.empty()&&Signal.top()!='(')
            {
                Equal+=Signal.top();
                Signal.pop();
            }
            Signal.push(Init_Equal[i]);
        }
        else if(Init_Equal[i]=='*'||Init_Equal[i]=='/')
        {
            while(!Signal.empty()&&Signal.top()!='('&&(Signal.top()=='*'||Signal.top()=='/'))		//乘法和除法優先順序一致
            {
                Equal+=Signal.top();
                Signal.pop();
            }
            Signal.push(Init_Equal[i]);
        }
        else
            continue;
        i++;
    }

    while(!Signal.empty())
    {
        Equal+=Signal.top();
        Signal.pop();
    }
}


double Get_Sum(string& Equal,queue<double> Num_Que)
{
    stack<double> Data;

    for(int i=0;i<Equal.length();i++)
    {
        double Val1,Val2;
        if(Equal[i]=='?')
        {
            Data.push(Num_Que.front());
            Num_Que.pop();
        }
        else if(Equal[i]=='+')
        {
            Val1=Data.top();
            Data.pop();
            Val2=Data.top();
            Data.pop();
            Data.push(Val1+Val2);
        }
        else if(Equal[i]=='-')
        {
            Val1=Data.top();
            Data.pop();
            Val2=Data.top();
            Data.pop();
            Data.push(Val2-Val1);
        }
        else if(Equal[i]=='*')
        {
            Val1=Data.top();
            Data.pop();
            Val2=Data.top();
            Data.pop();
            Data.push(Val1*Val2);
        }
        else if(Equal[i]=='/')
        {
            Val1=Data.top();
            Data.pop();
            Val2=Data.top();
            Data.pop();
            Data.push(Val2/Val1);
        }
        else
            continue;

    }
    return Data.top();
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        string Init_Equal;
        string Equal;
        queue<double> Num_Que;

        cin>>Init_Equal;
        Tranfer_Equal(Init_Equal,Equal,Num_Que);

        /*for(int i=0;i<Equal.length();i++)
        {
            if(Equal[i]=='?')
            {
                cout<<Num_Que.front();
                Num_Que.pop();
            }
            else
                cout<<Equal[i];
        }
        cout<<endl;*/

        double Res=Get_Sum(Equal,Num_Que);
        cout<<fixed<<setprecision(4)<<Res<<endl;
    }
    return 0;
}