用栈实现队列

        使用栈(Stack)来实现队列(Queue)的行为虽然不是最高效的方法(因为栈是后进先出LIFO,而队列是先进先出FIFO),但可以通过两个栈来实现这一功能。基本思路是,使用一个栈作为主栈(mainStack)来执行入队操作(push),而另一个栈(auxStack)则用于辅助出队操作(pop)。当需要出队时,如果辅助栈为空,则将主栈中的所有元素弹出并压入辅助栈中,这样原先主栈的栈底元素(即最早进入的元素)就位于辅助栈的栈顶,可以直接弹出。 

import java.util.Stack;  
  
public class MyQueue<T> {  
    private Stack<T> mainStack; // 主栈,用于执行入队操作  
    private Stack<T> auxStack;  // 辅助栈,用于执行出队操作  
  
    public MyQueue() {  
        mainStack = new Stack<>();  
        auxStack = new Stack<>();  
    }  
  
    // 入队操作  
    public void push(T x) {  
        mainStack.push(x);  
    }  
  
    // 出队操作  
    public T pop() {  
        if (auxStack.isEmpty()) { // 如果辅助栈为空,将主栈所有元素移到辅助栈  
            while (!mainStack.isEmpty()) {  
                auxStack.push(mainStack.pop());  
            }  
        }  
        if (auxStack.isEmpty()) { // 如果两个栈都为空,则队列为空,抛出异常  
            throw new IllegalStateException("Queue is empty");  
        }  
        return auxStack.pop(); // 返回辅助栈的栈顶元素  
    }  
  
    // 查看队首元素  
    public T peek() {  
        if (auxStack.isEmpty()) { // 同上,如果辅助栈为空,将主栈所有元素移到辅助栈  
            while (!mainStack.isEmpty()) {  
                auxStack.push(mainStack.pop());  
            }  
        }  
        if (auxStack.isEmpty()) { // 如果两个栈都为空,则队列为空,抛出异常  
            throw new IllegalStateException("Queue is empty");  
        }  
        return auxStack.peek(); // 返回辅助栈的栈顶元素,但不移除  
    }  
  
    // 检查队列是否为空  
    public boolean isEmpty() {  
        return mainStack.isEmpty() && auxStack.isEmpty();  
    }  
  
    public static void main(String[] args) {  
        MyQueue<Integer> queue = new MyQueue<>();  
  
        // 入队  
        queue.push(1);  
        queue.push(2);  
        queue.push(3);  
  
        // 查看队首元素  
        System.out.println("Front element: " + queue.peek()); // 输出: Front element: 1  
  
        // 出队  
        System.out.println("Popped element: " + queue.pop()); // 输出: Popped element: 1  
        System.out.println("New front element: " + queue.peek()); // 输出: New front element: 2  
  
        // 队列不为空  
        System.out.println("Queue is empty: " + queue.isEmpty()); // 输出: Queue is empty: false  
  
        // 继续出队直到队列为空  
        while (!queue.isEmpty()) {  
            System.out.println("Popped element: " + queue.pop());  
        }  
  
        // 队列为空  
        System.out.println("Queue is empty: " + queue.isEmpty()); // 输出: Queue is empty: true  
    }  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值