美文网首页
经典面试题--两个队列实现一个栈

经典面试题--两个队列实现一个栈

作者: 瀚海网虫 | 来源:发表于2020-10-08 00:27 被阅读0次

    1. 实现原理

    一个队列加入元素,弹出元素时,需要把队列中的 元素放到另外一个队列中,删除最后一个元素;
    两个队列始终保持只有一个队列是有数据的

    2. 示意图

    image.png

    3. 代码实现

    public class TwoQToS<T> {
        public static void main(String[] args) {
            MyStack<Integer> stack = new MyStack<Integer>();
            stack.push(1);
            stack.push(2);
            stack.push(3);
            stack.push(4);
            stack.push(5);
            try {
                System.out.println(stack.pop());
                System.out.println(stack.pop());
                System.out.println(stack.pop());
                System.out.println(stack.pop());
                System.out.println(stack.pop());
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            stack.push(10);
            stack.push(11);
            try {
                System.out.println(stack.pop());
                System.out.println(stack.pop());
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    
    class MyStack<T> {
        private Queue<T> queue1;
        private Queue<T> queue2;
    
        public MyStack() {
            queue1 = new LinkedList<>();
            queue2 = new LinkedList<>();
        }
        
        /**
         * 压栈 
         * 
         * 入栈非空的队列
         */
        public boolean push(T t) {
            if (!queue1.isEmpty()) {
                return queue1.offer(t);
            } else {
                return queue2.offer(t);
            }
        }
        
        /**
         * 出栈
         * @throws Exception 
         * 
         */
        public T pop() throws Exception {
            if (queue1.isEmpty() && queue2.isEmpty()) {
                throw new Exception("队列中没有数据");
            }
            if (!queue1.isEmpty() && queue2.isEmpty()) {
                while (queue1.size() > 1) {
                    queue2.offer(queue1.poll());
                }
                return queue1.poll();
            }
            if (!queue2.isEmpty() && queue1.isEmpty()) {
                while (queue2.size() > 1) {
                    queue1.offer(queue2.poll());
                }
                return queue2.poll();
            }
            return null;
        }
        @Override
        public String toString() {
            return this.queue1.toString() + ", " + this.queue2.toString();
        }
    }
    

    运行结果

    5
    4
    3
    2
    1
    11
    10
    

    相关文章

      网友评论

          本文标题:经典面试题--两个队列实现一个栈

          本文链接:https://www.haomeiwen.com/subject/yghcpktx.html