编写Java代码实现利用两个栈实现队列?
参考答案:
这是一个常见的算法问题,可以通过使用两个栈来实现一个队列。在队列中,元素的添加和删除操作分别被称为入队(enqueue)和出队(dequeue)。而在栈中,元素的添加和删除操作被称为压栈(push)和弹栈(pop)。由于栈是后入先出(LIFO)的数据结构,而队列是先进先出(FIFO)的数据结构,因此需要使用两个栈来模拟队列的行为。
以下是一个使用Java实现的例子:
import java.util.Stack;
public class MyQueue<T> {
private Stack<T> stack1;
private Stack<T> stack2;
public MyQueue() {
stack1 = new Stack<>();
stack2 = new Stack<>();
}
// 入队操作
public void enqueue(T item) {
stack1.push(item);
}
// 出队操作
public T dequeue() {
// 如果stack2为空,则将stack1中的元素全部转移到stack2中
if (stack2.isEmpty()) {
while (!stack1.isEmpty()) {
stack2.push(stack1.pop());
}
}
// 此时stack2的栈顶元素就是队列中的第一个元素,执行出队操作
return stack2.pop();
}
// 查看队首元素
public T peek() {
// 如果stack2为空,则将stack1中的元素全部转移到stack2中
if (stack2.isEmpty()) {
while (!stack1.isEmpty()) {
stack2.push(stack1.pop());
}
}
// 此时stack2的栈顶元素就是队列中的第一个元素,返回该元素
return stack2.peek();
}
// 检查队列是否为空
public boolean isEmpty() {
return stack1.isEmpty() && stack2.isEmpty();
}
}
这个实现中,我们使用了两个栈:stack1
用于入队操作,stack2
用于出队操作。在每次出队时,如果 stack2
为空,我们就将 stack1
中的所有元素转移到 stack2
中,然后再从 stack2
中弹出元素。这样就保证了队列的先进先出特性。
请注意,这个实现的时间复杂度在出队操作最坏的情况下是 O(n),其中 n 是队列中的元素数量。这是因为当 stack2
为空时,我们需要将 stack1
中的所有元素转移到 stack2
中。然而,在平均情况下,时间复杂度是 O(1),因为每个元素只会被转移一次。