java用两个队列实现栈

来源:互联网 发布:java 引用js文件 编辑:程序博客网 时间:2024/05/22 14:03
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    }}

0 0