爪哇国新游记之十九----使用Stack检查数字表达式中括号的匹配性

简介:
复制代码
/**
 * 辅助类
 * 用于记载字符和位置
 *
 */
class CharPos{
    char c;
    int pos;
    
    public CharPos(char c,int pos){
        this.c=c;
        this.pos=pos;
    }
}

/**
 * 括号检查类
 *
 */
public class BracketChecker{
    /**
     * 检查函数
     * @param str
     * @return
     * @throws Exception
     */
    public static boolean check(String str) throws Exception{
        int length=str.length();
        Stack<CharPos> stack=new Stack<CharPos>(CharPos.class,length);
        
        for(int i=0;i<length;i++){
            char ch=str.charAt(i);
            
            if(ch=='{' || ch=='[' || ch=='('){
                stack.push(new CharPos(ch,i));
            }else if(ch==')' || ch==']' || ch=='}'){
                try{
                    CharPos poped=stack.pop();
                    
                    if( (ch==')' && poped.c !='(') || (ch==']' && poped.c !='[') || (ch=='}' && poped.c !='{')){
                        throw new Exception("位于第"+(i+1)+"位的字符"+ch+"没有对应的匹配项");
                    }
                }catch(java.lang.ArrayIndexOutOfBoundsException e){
                    throw new Exception("位于第"+(i+1)+"位的字符"+ch+"没有对应的匹配项");
                }
            }
        }
        
        StringBuilder sb=new StringBuilder();
        while(stack.isEmpty()==false){
            CharPos poped=stack.pop();
            sb.append("位于第"+(poped.pos+1)+"位的字符"+poped.c+"没有对应的匹配项,");
        }
        if(sb.length()>0){
            throw new Exception(sb.toString());
        }
        
        return true;
    }
    
    public static void main(String[] args) throws Exception{
        String[] arr={"5+2*(3+3)","{[(2+4)*8]/6}","[()]}","{[(]}","{[](","(((((())))))","((([((())))))","[[[[[]]]]]"};
        
        for(String str:arr){
            try{
                boolean isOk=BracketChecker.check(str);
                if(isOk){
                    System.out.println("在字符串"+str+"中大中小括号都是匹配的.");
                }
            }catch(Exception e){
                System.out.println("在字符串"+str+"中,"+e.getMessage());
            }
        }
    }
}
复制代码

输出:

复制代码
在字符串5+2*(3+3)中大中小括号都是匹配的.
在字符串{[(2+4)*8]/6}中大中小括号都是匹配的.
在字符串[()]}中,位于第5位的字符}没有对应的匹配项
在字符串{[(]}中,位于第4位的字符]没有对应的匹配项
在字符串{[](中,位于第4位的字符(没有对应的匹配项,位于第1位的字符{没有对应的匹配项,
在字符串(((((())))))中大中小括号都是匹配的.
在字符串((([((())))))中,位于第11位的字符)没有对应的匹配项
在字符串[[[[[]]]]]中大中小括号都是匹配的.
复制代码















相关文章
|
4月前
|
算法
算法编程(二十七):千位分隔数
算法编程(二十七):千位分隔数
40 0
算法编程(二十七):千位分隔数
|
8月前
301. 删除无效的括号【我亦无他唯手熟尔】
301. 删除无效的括号【我亦无他唯手熟尔】
32 0
|
4月前
|
人工智能 C语言
C语言第十八弹---多个字符从两端移动向中间汇聚
C语言第十八弹---多个字符从两端移动向中间汇聚
|
5月前
|
算法 搜索推荐 程序员
C语言第十六练——数字组合匹配
C语言第十六练——数字组合匹配
58 0
|
8月前
|
机器学习/深度学习 算法
397. 整数替换【我亦无他唯手熟尔】
397. 整数替换【我亦无他唯手熟尔】
51 0
|
8月前
PTA第五章7-13 求一批整数中出现最多的个位数字
给定一批整数,分析每个整数的每一位数字,求出现次数最多的个位数字。例如给定3个整数1234、2345、3456,其中出现最多次数的数字是3和4,均出现了3次。
87 0
|
9月前
蓝桥——括号合法组合 2020-11-26
蓝桥——括号合法组合 2020-11-26
亲身经历:如何判断一个字符在a/z之前?
亲身经历:如何判断一个字符在a/z之前?
46 0
部落是一个魔法部落,部落中一共有n+1个人,小Biu是魔法部落中最菜的,所以他的魔力值为1,魔法部落中n个人的魔法值都不相同,第一个人的魔法值是小Biu的3倍,第二个人的魔法值是第一个人的3倍,以此类推。 现在小Biu想知道整个部落的魔法值和是多少?由于答案比较大,请把答案对1e9+7取模之后输出
部落是一个魔法部落,部落中一共有n+1个人,小Biu是魔法部落中最菜的,所以他的魔力值为1,魔法部落中n个人的魔法值都不相同,第一个人的魔法值是小Biu的3倍,第二个人的魔法值是第一个人的3倍,以此类推。 现在小Biu想知道整个部落的魔法值和是多少?由于答案比较大,请把答案对1e9+7取模之后输出
103 0