zoukankan      html  css  js  c++  java
  • (2016.4.13)第四次作业

    第四次作业

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

    反思

    其实做作业的时候蛮感谢的老师的,要是没有这个作业我也不会去了解一些命令行的知识,有一个人带带路,还是蛮开心的。
    
    后面去问了别人的思路,才知道在进栈前就把优先级的运算好,降级后,在进栈。后面想想这个思路真的不错,后面如果按班导师说的还要加入微积分的运算的话,也是这种方法更能处理好逻辑。(打算找个时间再改代码)
  • 相关阅读:
    【Linux】【Shell】【Basic】文件查找locate,find
    【Linux】【Shell】【text】Vim
    【Linux】【Shell】【text】文本处理工具
    【Linux】【Shell】【text】grep
    【Linux】【Basis】用户、组和权限管理
    什么是高并发;超发的解决思路(悲观锁与乐观锁);高并发与多线程的关系--持续更新(十四)
    线程池的应用(十三)
    线程池基本概念(十二)
    ThreadLocal(十一)
    tomcat的单例多线程代码示例(十)
  • 原文地址:https://www.cnblogs.com/UNWILL2LOSE/p/5389420.html
Copyright © 2011-2022 走看看