栈-判断括号串是否合法

判断一串括号是否合法我们可以使用栈的方式,这里列举leetcode的20题:

给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。

来自:https://leetcode-cn.com/problems/valid-parentheses

图示:

代码:

package com.study.algorithm.stack;

import com.study.algorithm.linkList.LinkNode;

/**
 * @Auther: JeffSheng
 * @Date: 2019/8/27 11:15
 * @Description:
 * 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
 *
 * 有效字符串需满足:
 *
 * 左括号必须用相同类型的右括号闭合。
 * 左括号必须以正确的顺序闭合。
 * 注意空字符串可被认为是有效字符串。
 *
 * 输入: "()[]{}"
 * 输出: true
 *
 * 输入: "{[]}"
 * 输出: true
 *
 * 输入: "([)]"
 * 输出: false
 */
public class ValidBrackets {

    private static final LinkStack linkStack = new LinkStack();


    public static boolean isValidBrackets(String[] arr){
        for (int i = 0; i <arr.length ; i++) {
            String bracket = arr[i];
            if("(".equals(bracket) || "[".equals(bracket) || "{".equals(bracket)){
                LinkNode newNode = new LinkNode(bracket);
                linkStack.push(newNode);
            }
            if(")".equals(bracket)){
                if("(".equals(linkStack.top.getData())){
                    linkStack.pop();
                }
            }
            if("}".equals(bracket)){
                if("{".equals(linkStack.top.getData())){
                    linkStack.pop();
                }
            }
            if("]".equals(bracket)){
                if("[".equals(linkStack.top.getData())){
                    linkStack.pop();
                }
            }
        }
        return linkStack.top==null;
    }

    public static void main(String[] args) {
        String[] arr = {"(",")","{","]","{","}"};
        System.out.println(isValidBrackets(arr));
    }
}
package com.study.algorithm.stack;

import com.study.algorithm.linkList.LinkNode;

/**
 * @Auther: jeffSheng
 * @Date: 2019/8/19 16:07
 * @Description:  基于链表实现的链栈
 */
public class LinkStack {

    LinkNode top = null;

    /**
     * 放入栈中一个元素
     * @param newNode
     */
    public void push(LinkNode newNode){
        //空栈
        if(top==null){
            top = newNode;
        }else{
            //非空栈
            newNode.setNext(top);
            top = newNode;
        }
    }

    /**
     * 从栈中弹出栈顶元素
     * @return
     */
    public LinkNode pop(){
        if(top==null){
            return null;
        }
        LinkNode popNode = top;
        top = top.getNext();
        return popNode;
    }


    /**
     * 遍历栈中元素
     */
    public void printAll(){
        LinkNode p = top;
        while(p!=null){
            System.out.println(p.getData());
            p = p.getNext();
        }
    }


}
发布了222 篇原创文章 · 获赞 805 · 访问量 27万+

猜你喜欢

转载自blog.csdn.net/shengqianfeng/article/details/100098107