第四次作业

github代码

思路分析

这次主要在原代码的情况下增加新的功能,然后思路就是一开始的时候就是不知道怎么用栈,之前做过的一题匹配括号的题,就想类似那个的思路,结果没想清楚

后面就用递归的方法,先分数字(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;
			}
		}

反思

其实做作业的时候蛮感谢的老师的,要是没有这个作业我也不会去了解一些命令行的知识,有一个人带带路,还是蛮开心的。

后面去问了别人的思路,才知道在进栈前就把优先级的运算好,降级后,在进栈。后面想想这个思路真的不错,后面如果按班导师说的还要加入微积分的运算的话,也是这种方法更能处理好逻辑。(打算找个时间再改代码)