两个栈实现一个队列(java)

本文介绍了如何利用两个栈的特性实现一个队列。在队列中元素遵循FIFO原则,而栈则是LIFO。通过一个栈进行入队操作,另一个栈进行出队操作,确保正确顺序。在出队时,需先将一个栈的所有元素弹出并压入另一个空栈,以模拟队列行为。最后提供相关代码实现。

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

1.队列

队列是尾进头出,所以下面的出队顺序是1234,如果后面再进567 出队的顺序是1234567

                                                 

2.栈

栈是后进先出,结合这一特点,我们可以用两个栈模拟一个队列。用一个栈来push,然后把他pop到另一个栈里面,按照栈后进先出的特点,pop完后会形成右面那幅图。如下图

                    

此时将右面那幅图输出。就形成了队列的出队顺序。(注意的是每次把栈1pop到栈2前,一定要确保栈2是空的,否则就一直pop栈2,知道它空才能再把栈1pop到栈2)如果没有保证栈2pop空了,就将栈1pop到栈2,会像下图一样:      

3.代码


public class StackQueue {
    private Stack<Integer> s1;
    private Stack<Integer> s2;

    public StackQueue() {
        this.s1 = new Stack();
        this.s2 = new Stack();
    }
    public void push(int val){
        s1.push(val);
    }
    public int poll(){
        if(s1.empty()&&s2.empty())throw new RuntimeException("队列为空");//如果两个栈都空,队列为空,抛异常
        if(!s2.empty()) return s2.pop();
        else while(!s1.empty()) s2.push(s1.pop());
        return s2.pop();
    }

    public static void main(String[] args) {
        StackQueue s = new StackQueue();
        for (int i = 0; i < 5; i++) {
            s.push(i);
        }
        System.out.println(s.poll());//0
        for (int i = 5; i < 10; i++) {
            s.push(i);
        }
        for (int i = 0; i < 10; i++) {
            System.out.print(s.poll());//123456789 java.lang.RuntimeException: 队列为空   
        }
    }
}

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值