用两个队列实现栈

转自:http://blog.csdn.net/renlei0109/article/details/52105908

思路

 假设有两个队列Q1和Q2,当二者都为空时,入栈操作可以用入队操作来模拟,
 可以随便选一个空队列,假设选Q1进行入栈操作,现在假设a,b,c依次入栈了(即依次进入队列Q1),
 这时如果想模拟出栈操作,则需要将c出栈,因为在栈顶,这时候可以考虑用空队列Q2,将a,b依次从Q1中出队,
 而后进入队列Q2,将Q1的最后一个元素c出队即可,此时Q1变为了空队列,Q2中有两个元素,队头元素为a,队尾元素为b,
 接下来如果再执行入栈操作,则需要将元素进入到Q1和Q2中的非空队列,即进入Q2队列,出栈的话,就跟前面的一样,
 将Q2除最后一个元素外全部出队,并依次进入队列Q1,再将Q2的最后一个元素出队即可。

<span style="font-size:14px;">package two_stack_to_queue;

import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.LinkedBlockingDeque;

/**
 * Created by renren on 16/8/3.
 * 
 * 思路
 * 假设有两个队列Q1和Q2,当二者都为空时,入栈操作可以用入队操作来模拟,
 * 可以随便选一个空队列,假设选Q1进行入栈操作,现在假设a,b,c依次入栈了(即依次进入队列Q1),
 * 这时如果想模拟出栈操作,则需要将c出栈,因为在栈顶,这时候可以考虑用空队列Q2,将a,b依次从Q1中出队,
 * 而后进入队列Q2,将Q1的最后一个元素c出队即可,此时Q1变为了空队列,Q2中有两个元素,队头元素为a,队尾元素为b,
 * 接下来如果再执行入栈操作,则需要将元素进入到Q1和Q2中的非空队列,即进入Q2队列,出栈的话,就跟前面的一样,
 * 将Q2除最后一个元素外全部出队,并依次进入队列Q1,再将Q2的最后一个元素出队即可。
 */
public class QueueToStack<T> {
    Queue<T> queueA = new LinkedList<>();
    Queue<T> queueB = new LinkedList<>();


    public void push(T value) {
        if (queueA.size() == 0 && queueB.size() == 0) {//如果两个队列都是空的话,则随便选择一个队列执行入栈操作
            queueA.add(value);
        }else if (queueA.size()==0&&queueB.size()!=0){///如果不是两个队列都是为空的话,则选择非空的队列入栈
            queueB.add(value);
        }else if (queueA.size()!=0&&queueB.size()==0){
            queueA.add(value);
        }
    }

    public T pop() {
        if (queueA.size()==0&&queueB.size()==0){
            return null;
        }
        T result = null;
        if (queueA.size()==0&&queueB.size()!=0){
            while (queueB.size()>0){
                result = queueB.poll();
                if (queueB.size()!=0){
                    queueA.add(result);
                }
            }
        }else if (queueA.size()!=0&&queueB.size()==0){
            while (queueA.size()>0){
                result = queueA.poll();
                if (queueA.size()!=0){
                    queueB.add(result);
                }
            }
        }
        return result;
    }

    public static void main(String[] args) {
        QueueToStack<Integer> stack=new QueueToStack<>();
        int tmp=0;
        stack.push(1);
        stack.push(2);
        stack.push(3);
        tmp=stack.pop();
        System.out.println(tmp);//3
        stack.push(4);
        tmp=stack.pop();
        System.out.println(tmp);//4
        tmp=stack.pop();
        System.out.println(tmp);//2
        stack.push(5);
        stack.push(6);
        tmp=stack.pop();
        System.out.println(tmp);//6
        tmp=stack.pop();
        System.out.println(tmp);//5
        tmp=stack.pop();
        System.out.println(tmp);//1
    }

}
</span>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值