一、题目描述
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合


二、解题思路
可以利用栈(先进后出),总共就三种类型的括号,我们将每一种括号的左半边存入到栈中,然后我们分别将字符串中剩下的每种括号的右半边与栈顶元素进行比较,如果能匹配上就将栈顶元素弹出,此时再进行当前栈顶元素的判断。
三、代码编写步骤
第一步:先声明一个字符串类型的栈,然后遍历栈中的每一个字符,将字符中的每种括号的左半边存储到栈中。
第二步:然后进行判断,列举出每一种匹配的条件,当满足某一种条件之后将其出栈。
四、代码演示
class Solution {
public boolean isValid(String s) {
//定义一个用来装字符类型的栈
Stack<Character> stack = new Stack<>();
for(int i=0; i<s.length(); i++){
char c = s.charAt(i);
//如果拿到的s中的元素是左边的括号类型就压栈
if(c == '(' || c=='[' || c=='{'){
stack.push(c);
}else{
/*
*在栈中有元素的情况下:在s中拿到的右边类型的元素和这个栈顶元素
*做个比较
*/
if(!stack.isEmpty()){
//看看栈顶的元素
char top = stack.peek();
//如果栈顶元素可以和‘)’配对,那就让栈顶元素出栈
if(c==')'&& top=='('){
stack.pop();
}else if(c==']'&&top=='['){
stack.pop();
}else if(c=='}'&&top=='{'){
stack.pop();
}else{
return false;
}
}else{
return false;
}
}
}
//最后,如果栈空了那就说明都匹配上了,如果栈里还有元素。
return stack.isEmpty();
}
}
第4行:定义一个用来装字符类型的栈。
第6行:遍历字符串s,获取第i个位置的字符
第8行:进行判断,如果拿到的第i个位置的字符是左边括号类型就压栈
第9行:进栈操作,就是将左边的字符压如栈中。
第15行:栈的非空判断,就是说如果栈里面有元素,那么进入下面的操作
第17行:stack.peek() 取出栈顶值,不出栈,将栈顶值赋给top
第19到24行:在下一次循环取出的某个字符能与栈顶匹配的话,就stack.pop(),该方法用于从堆栈中弹出元素,该元素从堆栈顶部弹出,并从堆栈顶部移除。
第34行:如果栈空了那就说明都匹配上了,如果栈里还有元素,继续上面你的方法。
总结
新手小白自己的一些见解,可能还有更好的方法或者效率更高的方法,不足之处还望指正。
本文详细介绍了如何使用栈数据结构解决有效括号字符串的问题。通过遍历输入字符串,遇到左括号压栈,遇到右括号时检查栈顶元素是否与其匹配,匹配则出栈,不匹配则返回错误。最终栈为空则表示所有括号匹配成功。
379

被折叠的 条评论
为什么被折叠?



