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