陨石的秘密

n由{},[],()三种括号对构成的字串,括号必须配对,可以嵌套,但不得交叉。
并且 () 内不能出现 {} 和 [],[] 内不能出现 {}。
n定义其深度为最大嵌套层数。
n()(())[]  深度为2
n{()[()]}  深度为3
n{{[[(())]]}}  深度为6
n()([]){}  不合法
n{([())]}  不合法
package com.w1m.test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Stack;

public class RockCode {

    
    private String strCode;
    
    private Stack<Object> stk;
    
    
    public RockCode()
    {
        this.strCode="";
        stk=new Stack<Object>();
    }
    
    
    public ReturnType processCodeSeg(String strParaCodeSeg)
    {
        ReturnType rt=new ReturnType();
        
        int itDegree=0;
        int itType;
        
        int j;
        
        if(strParaCodeSeg.equals(""))
        {
            rt.setItType(0);
            rt.setItDegree(0);
            rt.setBlNormal(true);
            return rt;
        }
        
        for(j=0;j<strParaCodeSeg.length();j++)
        {
            if(strParaCodeSeg.substring(j, j+1).equals("{"))
            {
                if(this.stk.isEmpty())
                {
                    this.stk.push(strParaCodeSeg.substring(j, j+1));
//                    itDegree++;
                    rt.setItDegree(++itDegree);
                }
                else if(((String)this.stk.peek()).equals("[") || ((String)this.stk.peek()).equals("("))
                {
                    return rt;
                }
                else
                {
                    //return -1;
//                    return rt;
                    
                    this.stk.push(strParaCodeSeg.substring(j, j+1));
//                    itDegree++;
                    rt.setItDegree(++itDegree);
                }
            }
            else if(strParaCodeSeg.substring(j, j+1).equals("["))
            {
                if(this.stk.isEmpty())
                {
                    this.stk.push(strParaCodeSeg.substring(j, j+1));
//                    itDegree++;
                    rt.setItDegree(++itDegree);
                }
                else if(((String)this.stk.peek()).equals("("))
                    return rt;
                else
                {
                    this.stk.push(strParaCodeSeg.substring(j, j+1));
//                    itDegree++;
                    rt.setItDegree(++itDegree);
                }
            }
            else if(strParaCodeSeg.substring(j, j+1).equals("("))
            {
                if(this.stk.isEmpty())
                {
                    this.stk.push(strParaCodeSeg.substring(j, j+1));
//                    itDegree++;
                    rt.setItDegree(++itDegree);
                }
//                else if(!((String)this.stk.peek()).equals("("))
//                    return rt;
                else
                {
                    this.stk.push(strParaCodeSeg.substring(j, j+1));
//                    itDegree++;
                    rt.setItDegree(++itDegree);
                }
            }
//            else
//                return rt;
            
            
            
            else if(strParaCodeSeg.substring(j, j+1).equals("}"))
            {
                if(!((String)this.stk.peek()).equals("{"))
                    return rt;
                else
                {
                    this.stk.pop();
                    if((--itDegree)==0) break;
                }
            }
            else if(strParaCodeSeg.substring(j, j+1).equals("]"))
            {
                if(!((String)this.stk.peek()).equals("["))
                    return rt;
                else
                {
                    this.stk.pop();
                    if((--itDegree)==0) break;
                }
            }
            else if(strParaCodeSeg.substring(j, j+1).equals(")"))
            {
                if(!((String)this.stk.peek()).equals("("))
                    return rt;
                else
                {
                    this.stk.pop();
                    if((--itDegree)==0) break;
                }
            }
            else
                return rt;
        }
        
//        return itDegree;
        if(j<strParaCodeSeg.length()-1)
        {
            rt.setItType(1);
            rt.setItPos(j);
            rt.setBlNormal(true);
            return rt;
        }
        else
        {
            rt.setItType(0);
            rt.setItPos(j);
            rt.setBlNormal(true);
            return rt;
        }
        
    }
    
    
    
    public int decodeRockCode(String strParaCodeString)
    {
        ReturnType rt=this.processCodeSeg(strParaCodeString);
        if(rt.blNormal)
        {
            if(rt.getItType()==0)
                return rt.getItDegree();
            else
                return maxCodeSegDegree(decodeRockCode(strParaCodeString.substring(0, rt.getItPos())),decodeRockCode(strParaCodeString.substring(rt.getItPos()+1)));
        }
        else
        {
            return 10000;
        }
//        return 0;
        
    }
    
    
    private int maxCodeSegDegree(int itPara1, int itPara2) 
    {
    
        // TODO Auto-generated method stub
        
        if(itPara1>itPara2)
            return itPara1;
        else
            return itPara2;
    }


    public String getStrCode() {
        return strCode;
    }



    public void setStrCode(String strCode) {
        this.strCode = strCode;
    }

    
    public class ReturnType
    {
        private boolean blNormal;    //陨石密码是否正确
        private int itDegree;        //陨石密码的深度
        private int itType;            //陨石密码的类型 0:非嵌套  1:嵌套
        private int itPos;            //陨石秘密处理字符位置
        
        public ReturnType()
        {
            this.blNormal=false;
        }
        
        
        
        public int getItPos() {
            return itPos;
        }



        public void setItPos(int itPos) {
            this.itPos = itPos;
        }



        public boolean isBlNormal() {
            return blNormal;
        }
        public void setBlNormal(boolean blNormal) {
            this.blNormal = blNormal;
        }
        public int getItDegree() {
            return itDegree;
        }
        public void setItDegree(int itDegree) {
            this.itDegree = itDegree;
        }
        public int getItType() {
            return itType;
        }
        public void setItType(int itType) {
            this.itType = itType;
        }
        
        
        
    }

    

    /**
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub

        System.out.println("input Rock Code string below:");
        BufferedReader br = new BufferedReader (new InputStreamReader(System.in));
//        int itInput,itCount=0;
        String strInput=br.readLine();
        
//        System.out.println("input 1st int number below:");
        
        
        RockCode rc=new RockCode();
//        ReturnType rtp=rc.processCodeSeg("{[()]}[]");
        
//        System.out.println("Normal:"+rtp.isBlNormal()+"  Type:"+rtp.getItType()+"   Degree:"+rtp.getItDegree()+"   Pos:"+rtp.getItPos());
//        System.out.println(rc.decodeRockCode("{[()]}[[[(]]]"));
        if((rc.decodeRockCode(strInput))==10000)
        {
            System.out.println("Error Rock Code string");
        }
        else
        {
        System.out.println(rc.decodeRockCode(strInput));
        }
    }

}

 

posted @ 2013-03-09 19:43  materazzi  阅读(206)  评论(0编辑  收藏  举报