简述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特性。