跳到主要内容

简述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,它包含两个栈对象 stack1stack2enqueue 方法用于向队列中添加元素,它简单地将元素压入 stack1dequeue 方法用于从队列中移除并返回元素,它首先检查 stack2 是否为空。如果 stack2 为空,则将 stack1 中的所有元素弹出并压入 stack2,然后返回 stack2 的顶部元素。如果 stack2 不为空,则直接返回 stack2 的顶部元素。isEmpty 方法检查队列是否为空,它返回 stack1stack2 是否都为空。size 方法返回队列的大小,它返回 stack1stack2 的大小之和。

这个实现确保了队列的FIFO特性,因为当从队列中移除元素时,总是从 stack2 中弹出元素,而 stack2 中的元素是按照它们被添加到 stack1 中的顺序排列的。当 stack2 为空时,我们需要将 stack1 中的所有元素转移到 stack2 中,以确保FIFO特性。