算法学习:LeetCode-面试题09. 用两个栈实现队列

题目:
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
实例:
输入:
[“CQueue”,“appendTail”,“deleteHead”,“deleteHead”]
[[],[3],[],[]]
输出:[null,null,3,-1]

当时没看实例懂什么意思,看了评论内容恍然大悟:
第一个列表中对应的是每一步的操作;
第二个列表是传入的参数(初始化队列和删除队列元素不需要参数所以是null);
第三个输出的列表表示的是每一步操作的返回值(同样地,初始化队列和添加元素是没有返回值的,只有删除队列的元素是才会返回删除的元素,没有元素的话返回-1).

解题思路:
这两个栈有主次之分,其中一个是作为辅助栈进行添加元素操作,栈的“后入先出”的特性可以保障元素在辅助栈
和主栈的传递元素过程中的顺序不会发生变化。
添加元素功能:
由于队列特性为:先入先出即一端为出口,一端为进口,而栈是一端作为进出口。
所以需要把后来新加入的元素放在栈的最低端,在利用栈删除时才能达到队列删除的“先进先出”的效果。
具体操作为:在向stack1加入value时,先把stack1中的左右元素压入stack2,再把value放入stack1,之后再把stack2的元素入栈。
删除操作:
此时可对stak1进行删除,对于stakc1来说删除的是栈顶元素,但是对于整个队列来说,删除的是队列底部的元素。

代码:

class MakeQueue {
    Stack<Integer> stack1;
    Stack<Integer> stack2;
    int size;

    public MakeQueue() {
        stack1 = new Stack<Integer>();
        stack2 = new Stack<Integer>();
        size = 0;
    }
    //添加操作
    public void appendTail(int value) {
    //1.将stak1的所有元素转移到stak2里
        while (!stack1.isEmpty()) {
            stack2.push(stack1.pop());
        }
        //2.将新加入的元素放在第一个栈的底部,在栈结构中是后进先出,但是我们实现的是队列的功能,就是后进后出
        stack1.push(value);
        //3.添加完在把原来的元素重新入栈
        while (!stack2.isEmpty()) {
            stack1.push(stack2.pop());
        }
        size++;
    }
    //删除操作
    public int deleteHead() {
        if (size == 0) {
            return -1;
        }
        size--;
        return stack1.pop();//此时删除的就是最早如队列的元素
    }
}

Reference:https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/solution/mian-shi-ti-09-yong-liang-ge-zhan-shi-xian-dui-l-3/

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值