跳到主要内容

编写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),因为每个元素只会被转移一次。