思路
栈的特点是先进后出, 队列的特点是先进先出。 我们可以设计两个栈, 一个栈stackPush
用来存放数据, 另一个栈stackPop
用来存放stackPush
栈中元素的倒序结果, 利用栈的特点, 就可以顺利成章的删除队头。 比如说:
stackPush
: 栈底 1 2 3 4 5 栈头stackPop
: 栈底 5 4 3 2 1 栈头
向栈中添加元素
- 向
stackPush
中添加即可
删除队头元素
- 当
stackPop
中仍然有元素的时候,直接返回头即可 - 如果上一步没有执行,说明
stackPop
中没有元素,先判断一下 ,有没有向stackPush
中添加元素,如果说没有,返回 -1 - 最后,说明
stackPush
中有元素,但是没有倒在stackPop
中,倒入 - 返回
stackPop
的栈顶
代码
class CQueue {
private LinkedList<Integer> stackPush;
private LinkedList<Integer> stackPop;
public CQueue() {
stackPop = new LinkedList<>();
stackPush = new LinkedList<>();
}
public void appendTail(int value) {
stackPush.addLast(value);
}
public int deleteHead() {
if(!stackPop.isEmpty()) return stackPop.removeLast();
if(stackPush.isEmpty()) return -1;
while(!stackPush.isEmpty()) {
stackPop.addLast(stackPush.removeLast());
}
return stackPop.removeLast();
}
}