09.用两个栈实现队列
题目
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
示例 1:
输入:
[“CQueue”,“appendTail”,“deleteHead”,“deleteHead”]
[[],[3],[],[]]
输出:[null,null,3,-1]
示例 2:
输入:
[“CQueue”,“deleteHead”,“appendTail”,“appendTail”,“deleteHead”,“deleteHead”]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]
思路
Stack,ArrayDeque,LinkedList都可以作为栈使用
三者的区别
底层数据存储方式
存储方式 | |
---|---|
Stack | 长度为10的数组 |
ArrayDeque | 长度为16的数组 |
LinkedList | 链表 |
线程安全
线程安全 | |
---|---|
Stack | 线程同步 |
ArrayDeque | 线程不同步 |
LinkedList | 线程不同步 |
- 在性能优先的前提下,不选用
Stack
- 频繁的插入、删除操作使用
LinkedList
链表 - 频繁的随机访问操作使用
ArrayDeque
结论:
这里选用LinkedList
链表实现Deque
接口作为栈使用,因为LinkedList线程不安全,所以性能高
代码(力扣提交 用时93,内存47)
class CQueue {
/*
* 定义两个栈成员
*/
Deque stack1;
Deque stack2;
public CQueue() {
stack1=new LinkedList(); //初始化两个栈
stack2=new LinkedList();
}
public void appendTail(int value) {
stack1.push(value); //入栈
}
/*
* 首先判断栈2是否为空,不为空直接输出栈顶元素,为空继续判断栈1是否为空,为空说明不存在元素直接返回-1
* 不为空,将栈1元素全部导入栈2,然后输出栈2栈顶元素,实现队列的先进先出特性
*/
public int deleteHead() {
if(stack2.isEmpty()) {
if(!stack1.isEmpty()) {
while(!stack1.isEmpty()) {
stack2.push(stack1.pop());
}
return (int) stack2.pop();
}else {
return -1;
}
}else {
return (int) stack2.pop();
}
}
}