Java中Stack类
今天首次用到了Stack这个类,在这里记录一下
栈是Vector的一个子类,它实现了一个标准的后进先出的栈。
堆栈只定义了默认构造函数,用来创建一个空栈。 堆栈除了包括由Vector定义的所有方法,也定义了自己的一些方法。
Stack()中定义的方法:
序号 | 方法描述 |
---|---|
1 | boolean empty() 检测堆栈是否为空 |
2 | Object peek( ) 查看堆栈顶部的对象,但不从堆栈中移除它 |
3 | Object pop( ) 移除堆栈顶部的对象,并作为此函数的值返回该对象 |
4 | Object push(Object element) 把项压入堆栈顶部 |
5 | int search(Object element) 返回对象在堆栈中的位置,以 1 为基数 |
可以通过一个小案例辅助理解。
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
1. 左括号必须用相同类型的右括号闭合。
2. 左括号必须以正确的顺序闭合。
例:输入: "()[]{}"
输出: true
思路:可以通过栈来进行是实现
- 将字符串转换为char类型
- 进行循环遍历,如果是‘(’,‘{’,‘[’,则压入栈底,如果是‘)’,‘}’,‘]’,则检测栈顶部对象,看二者是否是一左一右相匹配的括号,如果匹配则移除栈顶元素,如果不匹配则返回false。
- 循环完成后,如果栈对象为空,说明每组括号都匹配上了,返回true。
代码:
class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<Character>();
if(s.length() == 0) {
return true;
}
for(char c : s.toCharArray()) {
//如果最左侧为}])返回false
if (stack.isEmpty() && (c == '}' || c == ')' || c == ']')) {
return false;
}
if (c == '(' || c =='{' || c == '[') {
stack.push(c);
}
if (c == ')') {
if (stack.peek() == '(') {
stack.pop();
}else {
return false;
}
} else if (c == ']') {
if (stack.peek() == '[') {
stack.pop();
}else {
return false;
}
} else if (c == '}') {
if (stack.peek() == '{') {
stack.pop();
}else {
return false;
}
}
}
return stack.isEmpty();
}
}