以一道题 初识 栈 stack
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。 有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例
1: 输入: “()” 输出: true 示例
2: 输入: “()[]{}” 输出: true 示例
3: 输入: “(]” 输出: false 示例
4: 输入: “([)]” 输出: false 示例
5: 输入: “{[]}” 输出: true
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
代码:
class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
char[] chars = s.toCharArray();
for (char aChar : chars) {
if (stack.size() == 0) {
stack.push(aChar);
} else if (couple(stack.peek(), aChar)) {
stack.pop();
} else {
stack.push(aChar);
}
}
return stack.size() == 0;
}
public boolean couple(char c1 , char c2){
if(c1=='('&&c2==')'){
return true;
}else if(c1=='['&&c2==']'){
return true;
}else if(c1=='{'&&c2=='}'){
return true;
}else{
return false;
}
}
}
充分利用Stack的特性,首先创建一个判断一组的couple方法,然后遍历字符串进行压栈,利用peek方法不断的通过比较栈顶字符和当前遍历字符是否为一对,是一对就进行弹栈pop方法,最终遍历完,如果栈里面都弹完了,那就证明是符合规范的。
首先总结String的几种遍历方式
- for循环,利用str.length()和str.charAt();
- for循环,利用str.length()和str.substring();
- for循环,利用str.length()和str.toCharArray();
- 增强for
/ 方法一
for(int i=0;i < str.length();i++) {
System.out.println(str.charAt(i));
}
//方法二
for(int i=0;i < str.length();i++) {
System.out.println(str.substring(i,i+1));
}
//方法三
char[] c = str.toCharArray();
for(int i=0;i < c.length;i++) {
System.out.println(c[i]);
}
代码中有关stack的相关问题
主要用到
- stack.push();
public E push(E item)
将一个项目推到这个堆栈的顶部。这同样的效果:
addElement(item)
参数
item的项目被压入栈。 - stack.pop();
public E pop()
在这个堆栈的顶部删除对象,并返回该对象的值作为该函数的值。
结果
在栈顶的对象(的 Vector对象的最后一项)。 - stack.peek();
public E peek()
查看此堆栈顶部的对象,而不将它从堆栈中删除。
结果
在栈顶的对象(的 Vector对象的最后一项)。