每天写一点代码----双队列实现栈

本文详细介绍了如何使用两个队列模拟栈的基本操作,包括入栈和出栈,并提供了Java实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:

用两个队列模拟堆栈的操作(入栈与出栈)

思路:

我们知道队列是FIFO(先进先出),而栈是后进先出(LIFO)

要用两个队列实现堆栈我们可以这样做:

假设有A.B两个队列,开始都为空。那么:

入栈操作:

1,当A,B队列均为空时,直接将元素进入A队列。

2,当A,B队列有一个不为空时,将元素入队到不为空的那个队列中。

出栈操作:

1,当A,B 队列均为空时,出栈为Null。

2,当A,B队列有一个不为空时,将不为空的队列(假设为队列B)中的前N-1个元素依次入队到另一个队列(队列A)中,

再将B队列中剩下的最后的一个元素出队并返回之。


Java实现:

import java.util.LinkedList;
import java.util.Queue;

/**
 * 双队列实现栈
 * 
 * @author likebamboo
 * @create 2013-10-21
 * @param <E>
 */
public class MyStack<E> {
    /**
     * 队列A
     */
    private Queue<E> qA;

    /**
     * 队列B
     */
    private Queue<E> qB;

    public MyStack() {
        super();
        qA = new LinkedList<E>();
        qB = new LinkedList<E>();
    }

    /**
     * 入栈操作
     * 
     * @param item
     */
    public void push(E item) {
        // 如果B队列不为空,将元素入B队列
        if (!qB.isEmpty()) {
            qB.offer(item);
            return;
        }
        // 如果两个队列均为空,或者A队列不为空,均将原始加入A队列
        qA.offer(item);
    }

    /**
     * 出栈操作
     * 
     * @return
     */
    public E pop() {
        // 如果队列B不为空,那么将B队列中的前N-1个元素出队并进入A队。
        // 并将B队列中的最后一个元素出队列并返回。
        if (!qB.isEmpty()) {
            while (qB.size() > 1) {
                qA.offer(qB.poll());
            }
            return qB.poll();
        }

        // 如果队列B为空,那么不管A队列是否为空(为空时抛出异常也是合理的).
        // 将A队列中前N-1个元素出队并进入A队列。再返回A队列中的最后一个元素。
        while (qA.size() > 1) {
            qB.offer(qA.poll());
        }
        return qA.poll();
    }

    /**
     * 栈是否为空
     * 
     * @return
     */
    public boolean isEmpty() {
        return qA.isEmpty() && qB.isEmpty();
    }

    public static void main(String[] args) {
        MyStack<String> stack = new MyStack<String>();
        stack.push("first");
        System.out.println(stack.pop());
        stack.push("second");
        stack.push("third");
        stack.push("fourth");
        stack.push("fifth");
        System.out.println(stack.pop());
        System.out.println(stack.pop());
        System.out.println(stack.pop());

    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值