判断一串括号是否合法我们可以使用栈的方式,这里列举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();
}
}
}