题目:用两个栈实现一个队列,请实现它的两个函数add,remove,分别从队列尾部添加元素,和从队列头部移除元素。
首先我们来回顾下栈和队列的特性,栈的特性是先进后出,即它只能通过一个口出入,如下图,
队列的特性,先进先出,从队首出队,从对尾入队,如下图
解题过程
用两个栈来实现一个队列,根据栈和队列的特性,要解决的就是出队列的问题,解决过程如下图,我们称为 栈1和栈2
这样调用remove方法,我们就可以从"栈2"中一个一个的移除, 1,2,3,4,5,6,7,8。
那么此时来了新的值9,我们直接把它入到"栈1"里面。当调用remove方法到"栈2"无值时,将"栈1"中的值再次转移到"辅助栈2" 中。保证了出队列的顺序和入队列的顺序一样。
代码
import java.util.Stack;
class Queue<T>{
private Stack<T> pushStack = new Stack<>();// 栈1
private Stack<T> popStack = new Stack<>();// 栈2辅助栈
public void addLast(T e) {
pushStack.push(e);
}
/**
* 删除一个元素并返回
* @return
*/
public T removeFirst() {
transferElement();
if (!popStack.isEmpty()) {
return popStack.pop();
}
return null;
}
/**
* 返回队列头元素
* @return
*/
public T getFirst() {
transferElement();
return popStack.peek();
}
private void transferElement() {
if (!popStack.isEmpty()) {
return;
}
while (!pushStack.isEmpty()) {
popStack.push(pushStack.pop());
}
}
public boolean isEmpty() {
return pushStack.isEmpty() && popStack.isEmpty();
}
}
测试代码:
public class QueueAndStack {
/**
* 两个栈实现一个队列
*/
public static void main(String[] args) {
Queue<Integer> queue = new Queue<>();
for (int i = 0; i < 10; i ++) {
queue.addLast(i);
}
queue.removeFirst(); // 删除0
queue.addLast(11);
queue.removeFirst();// 删除1
System.out.println(queue.getFirst()); //输出2
while (!queue.isEmpty()) {
System.out.print(queue.removeFirst() + " ");
}
}
}