2个队列实现一个栈

在算法导论有一道非常有趣的证明题, 利用2个队列实现一个栈,   队列和栈最大的区别就是队列满足FIFO(先进先出),他有2个操作的地方,一个是队头一个是队尾,

而栈满足的是先进后出,他只有一个操作的地方就是栈顶。


我们定义 2 个队列 queue1 queue2  用于存放进"栈"  用queue2临时存 放queue1的数据。

那么实现他的方式就比较明显了,  首先我们先抽象的想象一下,我们封住队列的一个一端,元素进”的话,直接让他进去queue1队列

对于出栈”,把queue1的除开最后一个元素的其余的元素转移到queue2中   ,然后把刚才剩下queue1中的那个元素出队列(Stack.pop)。之后把q2中的全部元素转移回q1中。  


比如queue1中有三个数据c b  a.  那么我们把除开最后一个c以外的2个元素 b, a元素移到queue2.  如果这个时候用户出栈的话,

那么请问是不是就只有c了?  c就是栈顶。 c pop出去, 接着如果在执行出栈的话,我们在把queue2中除最后一个元素的元素

移到queue1 请问是不是只有b了?  那么执行pop就是出去b。 











下面给出Java实现代码:

   

import java.util.Queue;
 
public class Test_Queue {
    Queue<integer> queue1 = new ArrayDeque<>();
    Queue<integer> queue2 = new ArrayDeque<>();
 
    public void push(int node) {
        //两个栈都为空时,优先考虑queue1
        if (queue1.isEmpty()&&queue2.isEmpty()) {
            queue1.add(node);
            return;
        }
 
        //如果queue1为空,queue2有元素,直接放入queue2
        if (queue1.isEmpty()) {
            queue2.add(node);
            return;
        }
 
        if (queue2.isEmpty()) {
            queue1.add(node);
            return;
        }
 
    }
 
    public int pop() {
        //两个栈都为空时,没有元素可以弹出
        if (queue1.isEmpty()&&queue2.isEmpty()) {
            try {
                throw new Exception(stack is empty);
            } catch (Exception e) {
            }
        }
        //如果queue1为空,queue2有元素, 将queue2的元素依次放入queue1中,直到最后一个元素,我们弹出。
        if (queue1.isEmpty()) {
            while (queue2.size()>1) {
                queue1.add(queue2.poll());
            }
            return queue2.poll();
        }
 
        if (queue2.isEmpty()) {
            while (queue1.size()>1) {
                queue2.add(queue1.poll());
            }
            return queue1.poll();
        }
 
        return (Integer) null;
    }
 
    public static void main(String[] args) {
         Test_Queue   test_Queue = new  Test_Queue ();
        test_Queue.push(9);
        test_Queue.push(8);
        test_Queue.push(7);
        test_Queue.push(6);
        System.out.println(test_Queue.pop());
        System.out.println(test_Queue.pop());
        demo08.push(5);
        System.out.println(test_Queue.pop());
        System.out.println(test_Queue.pop());
        System.out.println(dtest_Queue.pop());
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值