您的位置 首页 java

剑指Offer 五 (Java版):用两个栈实现队列

一 栈

由于栈是先进后出,所以使用栈结构存储数据,讲究“先进后出”,即最先进栈的数据,最后出栈,栈的示意图如下。

栈中两个最重要的操作是PUSH和POP,两个是相反的操作。

PUSH:在堆栈的顶部加入一 个元素。

POP:在堆栈顶部移去一个元素, 并将堆栈的大小减一。

剑指Offer 五 (Java版):用两个栈实现队列

二 队列

队列也是一种特殊的线性表。不同于栈所服从的先进后出的原则,队列的原则是先进先出,队列在队头做删除操作,在队尾做插入操作。队列的示意图如下。

剑指Offer 五 (Java版):用两个栈实现队列

三 实现逻辑

那么接下来,我们如何借助两个栈来实现队列呢,

我们目前拥有两个栈A 和 栈B, 我们可以让栈A作为队列的入口,而 栈B作为队列的出口即可,

每次入栈的时候,即push都进入栈A 中,pop的时候,先判断栈B是否为空,如果栈B不为空,则直接栈B 出栈数据,如果栈B为空,判断栈A是否为空,如果也为空,说明此时队列中无任何数据,若栈A不为空,则按照栈A出栈顺序压入栈B中,然后栈B出栈数据即可。简单流程图如下。

进队列示意图如下

剑指Offer 五 (Java版):用两个栈实现队列

出队列示意图如下

剑指Offer 五 (Java版):用两个栈实现队列

四 实现代码

 public class MainUseStackImplementQueue {
    Stack<Integer> stackA = new Stack<Integer>();
    Stack<Integer> stackB = new Stack<Integer>();


    public static void main(String[] args) {
        MainUseStackImplementQueue mq = new MainUseStackImplementQueue();
        mq.push(1);
        mq.push(2);
        mq.push(3);
        System.out.println(mq.pop());
        mq.push(4);
        System.out.println(mq.pop());

    }

    public void push(int node) {
        stackA.push(node);
    }

    public int pop() {
        if(!stackB. isEmpty ()){
            return stackB.pop();
        }
         while  (!stackA.isEmpty()){
            stackB.push(stackA.pop());
        }
        //如果两个栈中都为空 返回0 避免异常
        if(stackB.isEmpty()){
            return 0;
        }
        return stackB.pop();
    }

}  

文章来源:智云一二三科技

文章标题:剑指Offer 五 (Java版):用两个栈实现队列

文章地址:https://www.zhihuclub.com/195419.shtml

关于作者: 智云科技

热门文章

网站地图