用两个栈组成的队列

题目:

编写一个类,用两个栈实现队列

要求:

支持队列的基本操作(add、poll、peek)

思路:

栈的操作是先进后出、而队列是先进先出,正好可以用两个栈来实现。
具体实现用一个栈来做为压入栈,在压入数据的时候,只想这个栈中加入,记为stackPush,另一个栈用来做出栈,在弹出的时候只找这个栈,记为stackPop。
因为进第一个栈的时候,数据的数据逆序了,在从第一个栈中进入第二个栈,这样数据就刚好会来了,在从第二个栈中弹出,不正好就是队列的顺序了吗?

大致的流程图.png

注意:必须做到的两点

  1. 如果栈stackPush要向stackPop中压入数据,那么必须一次把数据全部压入到stackPop中
  2. 如果stackPop不为空就不能向stackPop中压入数据

代码演示

package com.itz.zcy.stackAndQueue;

import java.util.Stack;

/**
 * 用两个栈实现队列的基本操作 add、poll peek
 */
public class TwoStacksQueue {

    public Stack stackPush;
    public Stack stackPop;

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

    /**
     * 向stackPush中添加数据
     * @param pushInt 要添加数据
     */
    public void add(int pushInt){
        stackPush.push(pushInt);
    }

    /**
     * 弹出方法
     * @return 返回要弹出的数据
     */
    public int poll(){
        if(stackPop.empty() && stackPush.empty()){
            throw new RuntimeException("Queue is empty");
        }
        pushToPop();
        return stackPop.pop();
    }

    /**
     * 查看栈顶元素
     * @return 返回栈顶元素
     */
    public int peek(){
        if(stackPop.empty() && stackPush.empty()){
            throw new RuntimeException("Queue is empty");
        }
        pushToPop();
        return stackPop.peek();
    }

    /**
     * 把数据从stackPush倒入到stackPop中,
     * 该方法只是内部使用
     */
    private void pushToPop(){
        // 判断stackPop是否为空,只有为空的时候才压入
        if(stackPop.empty()){
            // 每一次必须压入完
            while (!stackPush.empty()){
                stackPop.push(stackPush.pop());
            }
        }
    }
}

总结

该方法比较简单,分别通过栈和队列的特点来实现的;时间复杂度和空间复杂度都是O(n)。

文献:左程云著 《程序员代码面试指南IT名企算法与数据结构题目最优解》(第二版)
版权声明:此文版权归作者所有!

你可能感兴趣的:(用两个栈组成的队列)