简述Java双栈实现队列 ?
参考答案:
在Java中,我们通常使用两个栈(Stack)来实现一个队列(Queue)的功能。栈是一种后进先出(LIFO)的数据结构,而队列是一种先进先出(FIFO)的数据结构。下面是一个简单的示例,展示如何使用两个栈来实现队列:
import java.util.Stack;
public class QueueUsingTwoStacks<T> {
private Stack<T> stack1;
private Stack<T> stack2;
public QueueUsingTwoStacks() {
stack1 = new Stack<>();
stack2 = new Stack<>();
}
public void enqueue(T item) {
stack1.push(item);
}
public T dequeue() {
if (stack2.isEmpty()) {
while (!stack1.isEmpty()) {
stack2.push(stack1.pop());
}
}
return stack2.pop();
}
public boolean isEmpty() {
return stack1.isEmpty() && stack2.isEmpty();
}
public int size() {
return stack1.size() + stack2.size();
}
}
在这个实现中,我们定义了一个泛型类 QueueUsingTwoStacks,它包含两个栈对象 stack1 和 stack2。enqueue 方法用于向队列中添加元素,它简单地将元素压入 stack1。dequeue 方法用于从队列中移除并返回元素,它首先检查 stack2 是否为空。如果 stack2 为空,则将 stack1 中的所有元素弹出并压入 stack2,然后返回 stack2 的顶部元素。如果 stack2 不为空,则直接返回 stack2 的顶部元素。isEmpty 方法检查队列是否为空,它返回 stack1 和 stack2 是否都为空。size 方法返回队列的大小,它返回 stack1 和 stack2 的大小之和。
这个实现确保了队列的FIFO特性,因为当从队列中移除元素时,总是从 stack2 中弹出元素,而 stack2 中的元素是按照它们被添加到 stack1 中的顺序排列的。当 stack2 为空时,我们需要将 stack1 中的所有元素转移到 stack2 中,以确保FIFO特性。