这是我参与8月更文挑战的第十七天,活动详情查看:8月更文挑战
题目描述
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
-
左括号必须用相同类型的右括号闭合。
-
左括号必须以正确的顺序闭合。
-
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false
示例 5:
输入: "{[]}"
输出: true
回忆一下
什么是栈?
重点一
首先栈是一种数据结构,代表一种特殊的线性表,遵循先进后出,后进先出的原则。
重点二
栈帧随着方法的调用而创建,随着方法结束而销毁,存储了方法的局部变量信息
栈的一些知识
1.创建一个空栈
Stack()
2.测试栈是否为空
boolean empty()
3.查看栈顶部的对象,但不从栈中移除它
Object peek( )
4.移除栈顶部的对象,并作为此函数的值返回该对象
Object pop( )
5.把项压入栈顶部
Object push(Object element)
6.返回对象在栈中的位置,以 1 为基数
int search(Object element)
7.用栈Stack 创建对象(类型不同)
Stack stack = new Stack<>();
Stack stack = new Stack<>();
思路分析
只要遇到括号匹配的问题,我们就选择用栈,遇到左括号就进栈,遇到右括号,就判断栈顶元素是否与之匹配,匹配的话就pop出栈,不匹配的话就返回false。
- 遇到左括号((、{、[)就进栈
if(ch == '(' || ch == '{' || ch == '['){
stack.push(ch);
}
- 遇到右括号,就判断栈顶元素是否与之匹配,匹配的话就pop出栈,不匹配的话就返回false
else {
if(!stack.isEmpty()){
if(ch == ')'){
if(stack.pop() != '('){
return false;
}
}
if(ch == '}'){
if(stack.pop() != '{'){
return false;
}
}
if(ch == ']'){
if(stack.pop() != '['){
return false;
}
}
}
else {
return false;
}
}
完整代码
class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
for(char ch: s.toCharArray()){
if(ch == '(' || ch == '{' || ch == '['){
stack.push(ch);
} else {
if(!stack.isEmpty()){
if(ch == ')'){
if(stack.pop() != '('){
return false;
}
}
if(ch == '}'){
if(stack.pop() != '{'){
return false;
}
}
if(ch == ']'){
if(stack.pop() != '['){
return false;
}
}
}
else {
return false;
}
}
}
return stack.isEmpty();
}
}