栈----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; }}