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

2020-10-08  本文已影响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
上一篇下一篇

猜你喜欢

热点阅读