Leetcode-[简单]:用两个栈实现队列

题目:

    用两个栈实现一个队列。队列声明如下,请实现函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

例 1:

    输入:[[],[3],[],[]]    输出:[null,null,3,-1]

例 2:

    输入:[[],[],[5],[2],[],[]]    输出:[null,-1,null,null,5,2]

解题思路:

    维护2个栈:第1个栈存储元素,第2个栈辅助操作。

    根据栈特点,第1个栈底元素是最后插入元素,第1个栈顶元素是下一个被删除元素。为了维护队列特性,每次插入元素应该在第1个栈底。因此,每次插入元素时,若第,1个栈内已有元素,应将已有全部元素依次弹出并压入第2个栈,然后,将新元素压入第,1个栈,最后将第2个栈内全部元素依次弹出并压入第1个栈。经过上述操作,新插入元素在第1个栈底,第1个栈内其余元素顺序和插入元素之前保持一致。

    删除元素时,若第1个栈非空,则直接从第1个栈内弹出1个元素并返回,若第1个栈为空,则返回 -1。

    另外维护队列的元素个数,用于判断队列是否为空。初始元素个数为 0。每次插入元素,元素个数加 1。每次删除元素,元素个数减 1。

 

Code(JAVA):

public class CQueue {

    private Stack<Integer> stack01;

    private Stack<Integer> stack02;

    private int size;

    /**
     * Initialize your data structure here.
     */
    public CQueue() {
        stack01 = new Stack<>();
        stack02 = new Stack<>();
        size = 0;
    }

    /**
     * Push element x onto stack.
     */
    public void appendTail(int x) {
        if (stack01.isEmpty()) {
            stack01.push(x);
        } else {
            while (!stack01.isEmpty()) {
                stack02.push(stack01.pop());
            }
            stack01.push(x);
            while (!stack02.isEmpty()) {
                stack01.push(stack02.pop());
            }
        }
        size = size + 1;
    }

    /**
     * Removes the element on top of the stack and returns that element.
     */
    public int deleteHead() {
        if (!stack01.isEmpty()) {
            return stack01.pop();
        } else {
            return -1;
        }
    }

}


复杂度分析

一、 插入元素

    1.  时间复杂度:O(n)。插入元素,对于已有元素,每个元素都要弹出栈2次,压入栈2次,因此是线性时间复杂度。

    2.  空间复杂度:O(n)。需要使用额外空间存储已有元素。

 

二、 删除元素

    1.  时间复杂度:O(1)。判断元素个数和删除队头元素都使用常数时间。

    2.  空间复杂度:O(1)。从第1个栈弹出1个元素,使用常数空间。

 

感谢您的支持,请您关注作者公众号,有更多的分享

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值