LeetCode 232.用栈实现队列
LeetCode 225. 用队列实现栈
栈是一种数据结构 先进后出
java 中栈可以用 Stack 类表示。也可以用 Deque(双端队列)和 LinkedList 类表示。
压栈(push)、出栈(pop)、查看栈顶元素(peek)和获取栈的大小(size)。
Stack 类
底层是数组。
压栈时,元素会被加入数组的末尾;出栈时,数组末尾的元素被弹出。查看栈顶元素时,返回数组末尾的元素即可。
数组实现的栈的优点是速度快、效率高。缺点是数组大小是固定的,当栈中的元素数量超过数组大小时,需要进行扩容。扩容会带来额外的空间和时间开销。
另一种实现栈的方式是使用链表。链表实现的栈可以动态地增加和删除元素,不需要扩容。
Stack<Integer> stack = new Stack<>();
//
stack.push(1);
stack.push(2);
stack.push(3);
// peek
System.out.println(stack.peek()); // 3
// pop
System.out.println(stack.pop()); // 3
System.out.println(stack.pop()); // 2
System.out.println(stack.pop()); // 1
// 是否为空
System.out.println(stack.isEmpty()); // true
LinkedList 类
LinkedList<Integer> stack = new LinkedList<>();
// push
stack.push(1);
stack.push(2);
stack.push(3);
// peek
System.out.println(stack.peek()); // 输出3
// pop
System.out.println(stack.pop()); // 输出3
System.out.println(stack.pop()); // 输出2
System.out.println(stack.pop()); // 输出1
// 判断栈是否为空
System.out.println(stack.isEmpty()); // 输出true
栈的应用
方法 | 作用 | 返回值 |
---|---|---|
add | 增加一个元索 | 如果队列已满,则抛出一个IIIegaISlabEepeplian异常 |
remove | 移除并返回队列头部的元素 | 如果队列为空,则抛出一个NoSuchElementException异常 |
element | 返回队列头部的元素 | 如果队列为空,则抛出一个NoSuchElementException异常 |
offer | 添加一个元素并返回true | 如果队列已满,则返回false |
poll | 移除并返问队列头部的元素 | 如果队列为空,则返回null |
peek | 返回队列头部的元素 | 如果队列为空,则返回null |
put | 添加一个元素 | 如果队列满,则阻塞 |
put | 添加一个元素 | 如果队列满,则阻塞 |
take | 移除并返回队列头部的元素 | 如果队列为空,则阻塞 |
类名 | 是否阻塞 | 是否线程安全 | 是否有界 | 特点 |
---|---|---|---|---|
LinkedList | 非阻塞 | 线程安全 | 可选有界 | 基于链表 |
ArrayBlockingQueue | 阻塞 | 线程安全 | 有界 | 基于数组的有界队列 |
LinkedBlockingQueue | 阻塞 | 线程安全 | 可选有界 | 基于链表的无界队列 |
ConcurrentLinkedQueue | 非阻塞 | 线程安全 | 无界 | 基于链表 |
PriorityBlockingQueue | 阻塞 | 线程安全 | 无界 | 基于优先次序的无界队列 |
PriorityQueue | 非阻塞 | 非线程安全 | 无界 | |
SynchronousQueue | 阻塞 | 线程安全 | 无数据队列 | 内部没有容器的队列 较特别 |
LinkedBlockingQueue | 阻塞 | 线程安全 | 无界 | |
DelayQueue | 阻塞 | 线程安全 | 无界 | 基于时间优先级的队列 |
LinkedTrmsferQueue | 阻塞 | 线程安全 | 无界 | 基于链表 |