美文网首页
括号匹配问题的记录

括号匹配问题的记录

作者: fastcv | 来源:发表于2019-08-06 23:42 被阅读0次
假设表达式中包含三种括号:圆括号、方括号和花括号,它们可以互相嵌套,如{[()]},{[]}等均为正确的格式,而不对称的均为不正确的格式。
解:
public class BracketMatch {

    /**
     * 算法思路:
     *   1、因为括号都是左右对称的,那么,我们可以遇到左括号就把把它收起来,
     *   2、遇到右括号就拿最后一个放入的左括号进行匹配
     *   如果相匹配,继续进行1
     *   如果不匹配,则退出匹配并给出提示。
     *
     *   每次都拿最后一个,这里用栈比较合适,所有我们定义一个栈来存左括号
     */
    public static void main(String[] args) {
        String str = "([[](){}{()[()]}]";
        char[] chars = str.toCharArray();
        StackQueue queue = new StackQueue();
        for (int i = 0; i < chars.length; i++) {
            switch (chars[i]){
                case '(':
                case '[':
                case '{':
                    queue.push(chars[i]);
                    break;
                case ')':
                case ']':
                case '}':
                    if (queue.isEmpty()){
                        System.out.println("右括号多余!");
                        return;
                    }else {
                        char c = queue.getTop();
                        if (match(c,chars[i])){
                            queue.pop();
                        }else {
                            System.out.println("对应的左右括号不同类!");
                            return;
                        }
                    }
            }
        }
        if (queue.isEmpty()){
            System.out.println("括号匹配!");
        }else {
            System.out.println("左括号多余!");
        }
    }

    /**
     * 对比左右括号是否相匹配
     * @param left
     * @param right
     * @return
     */
    public static boolean match(char left, char right) {
        boolean result = false;
        switch (left){
            case '(':
                result = right == ')';
                break;
            case '[':
                result = right == ']';
            break;
            case '{':
                result = right == '}';
            break;
        }
        return result;
    }

    /**
     * 定义结点(栈)
     */
    static class StackNode {
        public char c ;
        public StackNode next = null;

        public StackNode(char c, StackNode next) {
            this.c = c;
            this.next = next;
        }
    }

    /**
     * 定义栈
     */
    static class StackQueue {
        StackNode top = null;
        int length = 0;

        //入栈操作
        public void push(char c){
            if (top == null){
                top = new StackNode(c,null);
            }
            StackNode node = new StackNode(c,null);
            node.next = top;
            top = node;
            length++;
        }

        //出栈操作
        public char pop(){
            if (length <= 0){
                new Exception("空栈,无元素!");
                return ' ';
            }
            char c = top.c;
            top = top.next;
            length--;
            return c;
        }

        //得到栈顶元素
        public char getTop(){
            if (length <= 0){
                new Exception("空栈,无元素!");
                return ' ';
            }
            return top.c;
        }

        //判断栈是否为空
        public boolean isEmpty(){
            return length == 0;
        }
    }
}

相关文章

  • 括号匹配问题的记录

    假设表达式中包含三种括号:圆括号、方括号和花括号,它们可以互相嵌套,如{[()]},{[]}等均为正确的格式,而不...

  • 3. 一些算法问题

    1. 括号匹配问题 算法:括号匹配问题 - 简书 C程序括号匹配检查 - Jason ZHANG的博客 - CSD...

  • 括号匹配问题

    这个问题的描述很简单,就是若括号匹配则返回true,否则返回false。 Given a string conta...

  • 括号匹配问题

    问题描述 有效字符串需满足: 左括号必须用相同类型的右括号闭合。包括:“( )”,“[ ]”,“{ }”。左括号必...

  • 栈、队列解决问题

    栈解决括号匹配问题 一个字符串中包含小括号、中括号、大括号,判断该字符串中的括号是否匹配 ()()[]{} 匹配...

  • 2019-12-13 刷题-2(栈)

    1021 删除最外层的括号 类似括号匹配问题,可以用栈,由于只有单种括号,也可以只用计数器来做。设置一个记录左括号...

  • chap3-栈和队列

    括号匹配问题 // 括号匹配,遇到 '\0' 结束// 遇到花、中、圆左括号进栈,遇到花、中、圆右括号检查栈顶元素...

  • 数据结构中使用指针运算括号匹配问题

    使用指针实现括号匹配问题:

  • 力扣第20题:有效的括号

    经典的括号匹配问题,用stack解决。

  • 算法:括号匹配问题

    还记得有一次笔试题,有一道括号匹配的算法题,当时没有学习数据结构和算法,思路很模糊,后来了解一些数据结构之后就有思...

网友评论

      本文标题:括号匹配问题的记录

      本文链接:https://www.haomeiwen.com/subject/itbgdctx.html