1. 题目
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/9b23d29fff50e821385ace39a99ba650.png#pic_center)
2. 思路
(1) Stack
- 添加时直接添加到栈in中,删除时先把栈in中的元素依次弹出再压入栈out中,完成后弹出栈out的栈顶元素并返回,最后再把栈out中的元素依次弹出压入栈in中。
- 最后一步没有必要,效率极低。
(2) List(不合要求)
- 没有使用两个栈来实现,而是维护了一个链表和一个输出元素的下标,直接输出即可。
(3) Deque
- 与(1)的思路基本相同,但是用Deque替换了Stack。
- Stack是线程安全的,但是效率低,不考虑线程安全的情况下推荐使用Deque。
- 压入栈out的元素没有必要再重新压入栈in中,依次输出,栈空时再从栈in中提取即可。
3. 代码
import java.util.*;
public class Test {
public static void main(String[] args) {
}
}
class CQueue {
private Stack<Integer> in;
private Stack<Integer> out;
public CQueue() {
in = new Stack<>();
out = new Stack<>();
}
public void appendTail(int value) {
in.push(value);
}
public int deleteHead() {
int result = -1;
if (!in.isEmpty()) {
while (!in.isEmpty()) {
out.push(in.pop());
}
result = out.pop();
while (!out.isEmpty()) {
in.push(out.pop());
}
}
return result;
}
}
class CQueue1 {
private List<Integer> list;
private int outIndex;
public CQueue1() {
list = new ArrayList<>();
outIndex = -1;
}
public void appendTail(int value) {
list.add(value);
}
public int deleteHead() {
if (outIndex != list.size() - 1) {
return list.get(++outIndex);
}
return -1;
}
}
class CQueue2 {
private Deque<Integer> in;
private Deque<Integer> out;
public CQueue2() {
in = new LinkedList<>();
out = new LinkedList<>();
}
public void appendTail(int value) {
in.push(value);
}
public int deleteHead() {
if (out.isEmpty()) {
while (!in.isEmpty()) {
out.push(in.pop());
}
}
return out.isEmpty() ? -1 : out.pop();
}
}