第四次作业
思路分析
这次主要在原代码的情况下增加新的功能,然后思路就是一开始的时候就是不知道怎么用栈,之前做过的一题匹配括号的题,就想类似那个的思路,结果没想清楚
后面就用递归的方法,先分数字(digital)和符号(symbol)栈,进站后,从后面往前看符号,然后如果为+,就进入递归,直到优先级为同级,进计算后返回,如果不同级进入相应的递归处理方法里。在这里栈就只是储存数据,感觉我并没有用处栈的真确思路。
然后对于负号的处理,我的处理就有点问题了,我是在进栈前分数字和符号的时候就看看是不是负数,这样就有一个问题,如果是类似1*(-(2+3))的时候,就没有办法了,负号没有直接连着数字没办法处理
核心代码(又臭又长。。。)
// 通过压栈降级
double Calculation::solve(){
while (!symbol.empty()){
double temp=digital.top();
digital.pop();
if (symbol.top()=="+"){
symbol.pop();
if (!symbol.empty()){
double flag=checkMulti()+temp;
// cout<<"+:flag:"<<flag<<endl;
digital.push(flag);
}else{
double flag=temp+digital.top();
digital.pop();
digital.push(flag);
}
}
else if (symbol.top()=="-"){
symbol.pop();
if (!symbol.empty()){
double flag=checkMulti()-temp;
// cout<<"-:flag:"<<flag<<endl;
digital.push(flag);
}else{
double flag=digital.top()-temp;
digital.pop();
digital.push(flag);
}
}
else if (symbol.top()=="*"){
symbol.pop();
if (!symbol.empty()){
double flag=checkMulti()*temp;
digital.push(flag);
// cout<<"*"<<flag<<endl;
}else{
double flag=digital.top()*temp;
digital.pop();
digital.push(flag);
}
}
else if (symbol.top()=="/"){
symbol.pop();
if (!symbol.empty()){
double flag=checkMulti()/temp;
digital.push(flag);
}else{
double flag=digital.top()/temp;
digital.pop();
digital.push(flag);
}
}
else if (symbol.top()==")"){
symbol.pop();
digital.push(temp);
double flag=solve();
digital.push(flag);
// cout<<"over"<<endl;
}
else if (symbol.top()=="("){
symbol.pop();
double flag=temp;
// cout<<"("<<flag<<endl;
return flag;
}
}
return digital.top();
}
// 实现检查下一符号
double Calculation::checkMulti(){
// cout<<"test"<<endl;
double sum;
if (digital.size()>1){
// 如果位+和-,则返回当前值
if (symbol.top()=="+"||symbol.top()=="-"){
// 记录下一个值,并pop符号和数值
sum=digital.top();
digital.pop();
// cout<<"sum:"<<sum<<endl;
return sum;
}else if (symbol.top()=="*"||symbol.top()=="/"){
if (symbol.top()=="*"){
symbol.pop();
sum=digital.top();
// cout<<"sum:"<<sum<<endl;
digital.pop();
sum=sum*checkMulti();
}else
if (symbol.top()=="/"){
symbol.pop();
sum=digital.top();
digital.pop();
sum=(1/sum)*checkMulti();
}
// cout<<"sum:"<<sum<<endl;
return sum;
}else if (symbol.top()==")"){
symbol.pop();
double flag=solve();
// cout<<"over"<<endl;
// cout<<flag<<endl;
return flag;
}else if (symbol.top()=="("){
double flag=digital.top();
digital.pop();
return flag;
}
}else{
sum=digital.top();
digital.pop();
// cout<<"sum:"<<sum<<endl;
return sum;
}
}
反思
其实做作业的时候蛮感谢的老师的,要是没有这个作业我也不会去了解一些命令行的知识,有一个人带带路,还是蛮开心的。
后面去问了别人的思路,才知道在进栈前就把优先级的运算好,降级后,在进栈。后面想想这个思路真的不错,后面如果按班导师说的还要加入微积分的运算的话,也是这种方法更能处理好逻辑。(打算找个时间再改代码)