也不是什么新的东西把,调度场也不说了,就说说我写过的三个版本表达式的成长吧
第一个简单计算器,没有括号没有单独考虑加减乘除优先级
第二个等价表达式主要是没有值吧,全代固定变量,然后没有除法
列出来:
[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;
}