笔试&&面试经验程序员面试的那些小事

编写一个类,用两个栈实现队列,支持队列的基本操作(add、pol

2017-11-28  本文已影响41人  624c95384278

本题来自程序员代码面试指南


编写一个类,用两个栈实现队列,支持队列的基本操作(add、poll、peek)

实现思路

一个栈作为压入栈,在压入数据时只往这个栈中压入,记为stackPush;
另一个栈只作为弹出栈,在弹出数据时只从这个栈弹出,记为stackPop。
实现这个有俩个关键点

public class TwoStacksQueue {
    private Stack<Integer> stackPush;//压入数据栈
    private Stack<Integer> stackPop; //弹出数据栈

    public TwoStacksQueue() {
        this.stackPop = new Stack<>();
        this.stackPush = new Stack<>();
    }

    /**
     * 入队操作
     * 直接将数据压入压入数据栈
     * @param push
     */
    public void push(int push) {
        this.stackPush.push(push);
    }


    /**
     * 出队操作
     * @return
     */
    public int poll() throws Exception {
        if (stackPush.isEmpty() && stackPop.isEmpty()) {
            throw new Exception("队列中没有数据");
        } else if (stackPop.isEmpty()) {
            //弹出数据栈为空,可以将整个压入数据栈中的数据倒入弹出数据栈
            while (!stackPush.isEmpty()) {
                stackPop.push(stackPush.pop());
            }
        }
        return stackPop.pop();
    }

    /**
     * 返回队头元素
     * @return
     * @throws Exception
     */
    public int peek() throws Exception {
        if (stackPush.isEmpty() && stackPop.isEmpty()) {
            throw new Exception("队列中没有数据");
        }else if (stackPop.isEmpty()) {
            //弹出数据栈为空,可以将整个压入数据栈中的数据倒入弹出数据栈
            while (!stackPush.isEmpty()) {
                stackPop.push(stackPush.pop());
            }
        }
        return stackPop.peek();
    }
}

附上github地址

上一篇下一篇

猜你喜欢

热点阅读