欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【数据结构与算法】06. java判断字符串是否合法(栈)

程序员文章站 2024-03-16 15:52:52
...

一个月前,和小伙伴每周来一道算法题,一直没有总结,今天看数据结构中的栈和队列,看到了一个非常有意思的总结,什么是栈,什么是队列呢?一个经典的评论且有味的总结是这么说的,“吃饭吃多了想吐,就是栈。吃饭吃多了想拉,就是队列。” 笑死啦。 栈这种受限的线性结构,有什么神奇之处呢?

如果给你一段字符串 “{ [ ( ) ] }”,给你三种括号,且这三种括号任意嵌套,如何检查这段字符串是否合法。比如“{ [ ] ( )[ { } ] }” 或“[ { ( ) } ( [ ] ) ]”等都为合法格式,而“{ [ }( )]”或”[ ( { ) ]”为不合法的格式。通过什么样的方式检查它呢?

其实栈这种数据结构可以解决该类问题,我们用栈来保存未匹配的左括号,从左到右依次扫描字符串。当扫描到左括号时,则将其压入栈中;当扫描到右括号时,从栈顶取出一个左括号。如果能够匹配,比如“(”跟“)”匹配,“[”跟“]”匹配,“{”跟“}”匹配,则继续扫描剩下的字符串。如果扫描的过程中,遇到不能配对的右括号,或者栈中没有数据,则说明为非法格式。当所有的括号都扫描完成之后,如果栈为空,则说明字符串为合法格式;否则,说明有未匹配的左括号,为非法格式。

package com.fjx.stringcheck;

import java.util.HashMap;
import java.util.Map;
import java.util.Stack;

public class ValidCheck {
    public static void main(String[] args) {
        // 定义字符串的内容
        String symbol="[(]){}";
        // 调用判断方法
        boolean result=isValid(symbol);
        System.out.print(result);
    }

    public static boolean isValid(String s){
        // 定义一个空栈
        Stack<Character> stack=new Stack<>();
        // 定义 map ,用来存放匹配的符号
        Map<Character,Character> map=new HashMap<>();
        // 将字符串存入数组arr中
        char[] arr=s.toCharArray();
        // 通过键值对的方式存储数据
        map.put(')','(');
        map.put(']','[');
        map.put('}','{');

            for (int i=0;i<arr.length;i++){
                // 如果 map 的键中不包含右边括号,也就是做左括号直接进栈
                if (!map.containsKey(arr[i])){
                    stack.push(arr[i]);
                }else {
                    // 栈顶弹出左括号,如果与右括号不匹配,则不合法,直接返回false
                    if (map.get(arr[i])!=stack.pop()){
                        return false;
                    }
                }
            }
        // 判断栈是否为空,为空,说明所有符号都已匹配完毕,全都合法,否则不合法
        if (stack.empty()){
            return true;
        }else {
            return false;
        }
    }
}

栈,你 GET 到了么?