栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【每天一道算法题】动图解析栈的应用之括号匹配(附源码)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【每天一道算法题】动图解析栈的应用之括号匹配(附源码)

本专栏将会从基础开始,循序渐进,每天刷一道算法题,也请大家多多支持。数据结构虽然难,但只要肯坚持,一定能学好,希望大家都能够从中获益。
专栏地址: 每天一道算法题专栏 数据结构专栏
本专栏的所有代码都将更新在Gitee上,项目地址:项目地址
相关数据结构演示软件:链接地址
数据结构在线演示地址:https://visualgo.net/zh https://algorithm-visualizer.org/

准备好了吗
Let’s go!

文章目录
    • 栈在括号匹配中的应用

栈在括号匹配中的应用

所谓括号校验匹配就是对多种类型的括号进行正确配对的校验(包括:()、[]、{})即([])或者[()]为正确的表达式,如果出现交叉则匹配失败,如[(])或([())则为不正确格式。下图是括号匹配的示意图,相同的数字表示所配对的括号:

从上图可以发现:

1️⃣:每出现一个右括号,就消耗一个左括号

2️⃣:最后出现的左括号最先被匹配

所以可以用栈的特点来解决该问题,算法演示如下:

代码如下:

public static boolean bracketCheck(String str){
    LinkedStack S = new LinkedStack(); //初始化一个栈
    for(int i=0;i
        //如果扫描到左括号,则入栈
        if(str.charAt(i) == '(' || str.charAt(i) == '[' || str.charAt(i) == '{' ){
            S.push(str.charAt(i));
        }else{
            //扫描到右括号,且当前栈空
            if(S.isEmpty()){
                return false;
            }
            //栈顶元素出栈
            char topElem = S.pop();
            //判断是否匹配
            if(str.charAt(i) == ')' && topElem != '('){
                return false;
            }
            if(str.charAt(i) == ']' && topElem != '['){
                return false;
            }
            if(str.charAt(i) == '}' && topElem != '{'){
                return false;
            }
        }
    }
    //检索完全部括号后,栈空说明匹配成功
    return S.isEmpty();
}

完整代码如下:

//链栈

import java.util.Scanner;

//结点
class LinkedNode{
    public T iData;         //数据域
    public LinkedNode next;    //指向下一个结点

    public LinkedNode(T iData) {
        this.iData = iData;
        this.next = null;
    }

    public LinkedNode(T iData, LinkedNode next) {
        this.iData = iData;
        this.next = next;
    }

    //输出用
    @Override
    public String toString() {
        return "LinkedNode{" +
                "iData=" + iData +
                ", next=" + next +
                '}';
    }
}
//链栈
class LinkedStack {
    public LinkedNode first; //链表的第一个结点

    //构造函数
    public void LinkList() {
        first = null;
    }

    //判断链栈是否为空
    public boolean isEmpty() {
        return first == null;
    }

    //push
    public void push(T data){
        LinkedNode newNode = new LinkedNode(data);
        newNode.next = first;
        first = newNode;
    }

    //pop
    public T pop(){
        if (first == null){
            System.out.println("链表为空");
            return null;
        }
        T front =  first.iData;
        first = first.next;
        return front;
    }



}


public class _002LinkStackTest {
    public static boolean bracketCheck(String str){
        LinkedStack S = new LinkedStack(); //初始化一个栈
        for(int i=0;i
            //如果扫描到左括号,则入栈
            if(str.charAt(i) == '(' || str.charAt(i) == '[' || str.charAt(i) == '{' ){
                S.push(str.charAt(i));
            }else{
                //扫描到右括号,且当前栈空
                if(S.isEmpty()){
                    return false;
                }
                //栈顶元素出栈
                char topElem = S.pop();
                //判断是否匹配
                if(str.charAt(i) == ')' && topElem != '('){
                    return false;
                }
                if(str.charAt(i) == ']' && topElem != '['){
                    return false;
                }
                if(str.charAt(i) == '}' && topElem != '{'){
                    return false;
                }
            }
        }
        //检索完全部括号后,栈空说明匹配成功
        return S.isEmpty();
    }

    public static void main(String[] args) {
//        LinkedStack integerLinkedNode = new LinkedStack();
//
//        integerLinkedNode.push(1);
//        integerLinkedNode.push(2);
//        integerLinkedNode.push(3);
//
//        while(!integerLinkedNode.isEmpty()){
//            System.out.println(integerLinkedNode.pop());
//        }
        Scanner scanner = new Scanner(System.in);
        String str = scanner.nextLine();  //测试案例:[(())[]]
        System.out.println(bracketCheck(str));


    }
}

代码的运行结果如下:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/860978.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号