前言
熟悉Class Stack.
栈
关于栈—笔者的C语言描述
java.util包有Stack集合类.
JDK17的Stack源码非常简单,能相对轻易看懂.
我们能用Stack类来充当栈,Java框架中LinkedList
(双向链表)实现了双端队列(Deque)
,也能当作栈使用.
Stack类是基于数组实现.
public Stack<E> extends Vector<E>{
...
}
Stack() 构造一个空的栈
E push(E e) 将e入栈,并返回e
E pop() 将栈顶元素出栈并返回
E peek() 获取栈顶元素
int size() 获取栈中有效元素个数
boolean empty() 检测栈是否为空
Stack类里面提供了6种常用方法,JDK17中Stack类里面只有这6种方法.
Stack可以调用父类Vector的方法,若只是当作栈使用,这6种方法足够了.
入栈
:对应push
出栈
:对应pop
,同时可以获取堆顶元素
.
获取堆顶元素
:对应peek
栈使用实例
用栈倒序打印链表元素.
public static void main(String[] args) {
LinkedList<Integer> list = new LinkedList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
var stack = new Stack<Integer>();
for(int x:list) {
stack.push(x);
}
while(!stack.isEmpty())
{
System.out.println(stack.pop()+" ");
}
}
有效的括号
多看几组数据
s = "()"
—true
s = "()[]{}"
—true
s = "(]"
—false
s = ([)]
—false
为什么想到用栈这一数据结构呢?
栈的特点是后进先出.左括号与右括号的匹配是什么样的模式?
显而易见,右括号会与它最近的左括号匹配—若匹配失败则一定不是.
最近一词,显然满足后进先出的特点,与栈不谋而合.
算法设计:
- 遍历字符串,若遇到左括号进行入栈处理.
- 若遇到右括号则进行匹配,过程就是将最近的左括号出栈匹配.
- 匹配失败则结束循环,否则继续按照1,2过程遍历.
- 字符串遍历结束.检查栈是否为空.
- 栈不为空,说明左括号和右括号一定不等,返回false.
另外,字符串长度必须为偶数,才有可能满足上述条件.
class Solution {
public boolean isValid(String s) {
if(s.length()%2==1)
return false;
Stack<Character> stack = new Stack<>();
for(int i = 0;i<s.length();i++)
{
char c = s.charAt(i);
if(c == '('||c ==