> 技术文档 > 栈----1.有效的括号

栈----1.有效的括号

20. 有效的括号 - 力扣(LeetCode)

/**

        括号特性:

                左括号必定先出现,每个左括号都需要一个右括号与之匹配,后出现的左括号先匹配

        解法:

                依据后出现的左括号先匹配,很容易联想到栈,即后进先出

                遍历字符串,遇到左括号就在栈中添加一个对应的右括号

                遇到右括号就弹出栈顶元素判断是否一致(当前遍历到的最后一个出现的左括号是否能闭合)

            不合法:    

                若弹出的右括号与遇到的右括号不一致---> 左右类型不匹配,不合法

                若遇到右括号时栈中无元素可弹出---> 右括号多余无法闭合,不合法

                若字符串遍历结束栈中仍有元素---> 左括号多余无法闭合,不合法

*/

class Solution { /** 括号特性: 左括号必定先出现,每个左括号都需要一个右括号与之匹配,后出现的左括号先匹配 解法: 依据后出现的左括号先匹配,很容易联想到栈,即后进先出 遍历字符串,遇到左括号就在栈中添加一个对应的右括号 遇到右括号就弹出栈顶元素判断是否一致(当前遍历到的最后一个出现的左括号是否能闭合) 不合法:  若弹出的右括号与遇到的右括号不一致---> 左右类型不匹配,不合法 若遇到右括号时栈中无元素可弹出---> 右括号多余无法闭合,不合法 若字符串遍历结束栈中仍有元素---> 左括号多余无法闭合,不合法 */ public boolean isValid(String s) { //利用双端队列模拟栈 Deque stack = new ArrayDeque(); //按规则遍历字符串 for(char c : s.toCharArray()) { //将对应的右括号入栈 if(c == \'(\') { stack.push(\')\'); } else if(c == \'[\') { stack.push(\']\'); } else if(c == \'{\') { stack.push(\'}\'); } //遇到右括号,判断是否合法 else { //右括号多余或左右类型不匹配 不合法 if(stack.isEmpty() || stack.pop() != c) {  return false; } } } //左括号多余 if(!stack.isEmpty()) { return false; } return true; }}