题目:这是来自京东物流的一道笔试题,请用两个栈实现一个队列。需要非常注意的是两个栈的入栈和出栈的时机。
public class Demo13 {
public static void main(String[] args) {
TwoStacksQueue<Integer> integerTwoStacksQueue = new TwoStacksQueue<>();
integerTwoStacksQueue.enqueue(1);
integerTwoStacksQueue.enqueue(2);
integerTwoStacksQueue.enqueue(3);
integerTwoStacksQueue.enqueue(4);
integerTwoStacksQueue.enqueue(5);
System.out.println(integerTwoStacksQueue.dequeue());
System.out.println(integerTwoStacksQueue.dequeue());
System.out.println(integerTwoStacksQueue.dequeue());
System.out.println(integerTwoStacksQueue.dequeue());
System.out.println(integerTwoStacksQueue.dequeue());
}
}
class TwoStacksQueue<T> {
private Stack<T> inStack;// 入队栈
private Stack<T> outStack;// 出队栈
public TwoStacksQueue() { // 构造方法设置初始值
inStack = new Stack<>();
outStack = new Stack<>();
}
public void enqueue(T item) { // 入队只需要向入队栈压入数据即可
inStack.push(item);
}
public T dequeue() { // 出栈之前需要把入队栈所有元素压入出队栈
if (outStack.isEmpty()) { // 这一步很关键,如果非空,需要等待出队栈为空
while (!inStack.isEmpty()) { // 所有元素压入出队栈
outStack.push(inStack.pop());
}
}
if (outStack.isEmpty()) {
throw new IllegalStateException("Queue is empty");
}
return outStack.pop(); // 出队栈非空时,直接出队即可
}
public boolean isEmpty() { // 判断整个队列是否为空。
return inStack.isEmpty() && outStack.isEmpty();
}
public int size() { // 获取整个队列的长度
return inStack.size() + outStack.size();
}
}
如果大家需要视频版本的讲解,欢迎关注我的B站: