调度场算法-表达式计算

也不是什么新的东西把,调度场也不说了,就说说我写过的三个版本表达式的成长吧

第一个简单计算器,没有括号没有单独考虑加减乘除优先级

第二个等价表达式主要是没有值吧,全代固定变量,然后没有除法

列出来:

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值