剑指 Offer 09. 用两个栈实现队列

这篇具有很好参考价值的文章主要介绍了剑指 Offer 09. 用两个栈实现队列。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


🚀 作者简介:一名在后端领域学习,并渴望能够学有所成的追梦人。
🚁 个人主页:不 良
🔥 系列专栏:🛸剑指 Offer  🛹Linux
📕 学习格言:博观而约取,厚积而薄发
🌹 欢迎进来的小伙伴,如果小伙伴们在学习的过程中,发现有需要纠正的地方,烦请指正,希望能够与诸君一同成长! 🌹


剑指 Offer 09. 用两个栈实现队列

题目:

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

示例1:

输入:
[“CQueue”,“appendTail”,“deleteHead”,“deleteHead”,“deleteHead”]
[[],[3],[],[],[]]
输出:[null,null,3,-1,-1]

示例2:

输入:
[“CQueue”,“deleteHead”,“appendTail”,“appendTail”,“deleteHead”,“deleteHead”]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]

提示:

  • 1 <= values <= 10000
  • 最多会对appendTail、deleteHead进行 10000 次调用

思路一:

双栈。栈是先进后出的机构,队列是先进先出的结构。

CQueue()作为一个构造函数,在本题中不用管。

1.定义两个栈pushstpopst,将pushst栈作为输入栈用于appendTail操作,popst栈作为输出栈用于deleteHead操作;

2.进行appendTail操作时,直接将数据压入pushst栈中;

3.进行deleteHead操作时:

  • 先检查popstpushst是否为空,如果为空直接返回-1;

  • 如果popst为空且pushst不为空,将pushst中的数据从栈顶开始放入popst中,然后再进行删除返回操作。

  • 如果popst不为空,直接删除并返回栈顶元素。

代码如下:

class CQueue {
public:
    CQueue() {
        
    }
    
    void appendTail(int value) {
        pushst.push(value);
    }
    
    int deleteHead() {
        if(pushst.empty() && popst.empty())
            return -1;
        //如果popst中为空,则将pushst中的数据都倒入popst中
        if(popst.empty() && !pushst.empty())
        {
            while(!pushst.empty())
            {
                int tmp = pushst.top();
                popst.push(tmp);
                pushst.pop();
            }
        }
        //如果popst中不为空,直接删除并返回
        int tmp = popst.top();
        popst.pop();
        return tmp;
    }
private:
    stack<int> pushst;//实例化一个pushst栈,用于压入数据
    stack<int> popst;//实例化一个popst栈,用于删除数据
};

插入:

时间复杂度:O(1)

空间复杂度:O(1)

删除:

时间复杂度:O(N),要将pushst中的数据全部压入popst中。

空间复杂度:O(N),使用了辅助栈的空间。文章来源地址https://www.toymoban.com/news/detail-475780.html

到了这里,关于剑指 Offer 09. 用两个栈实现队列的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 剑指 Offer 52. 两个链表的第一个公共节点

    🚀 作者简介:一名在后端领域学习,并渴望能够学有所成的追梦人。 🚁 个人主页:不 良 🔥 系列专栏:🛸剑指 Offer  🛹Linux 📕 学习格言:博观而约取,厚积而薄发 🌹 欢迎进来的小伙伴,如果小伙伴们在学习的过程中,发现有需要纠正的地方,烦请指正,希望能够与诸

    2024年02月10日
    浏览(30)
  • (链表) 剑指 Offer 25. 合并两个排序的链表 ——【Leetcode每日一题】

    难度:简单 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。 示例1: 输入:1-2-4, 1-3-4 输出:1-1-2-3-4-4 限制 : 0 = 链表长度 = 1000 注意:本题与 21. 合并两个有序链表 相同 💡思路: 法一:递归 将该问题可以分解成子链表,只比较当前 l1 链

    2024年02月15日
    浏览(32)
  • (链表) 剑指 Offer 52. 两个链表的第一个公共节点 ——【Leetcode每日一题】

    难度:简单 输入两个链表,找出它们的第一个公共节点。 如下面的两个链表: 在节点 c1 开始相交。 示例 1: 输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3 输出:Reference of the node with value = 8 输入解释:相交节点的值为 8 (注意,如果两个列表相交则

    2024年02月15日
    浏览(35)
  • 【算法】双指针——leetcode盛最多水的容器、剑指Offer57和为s的两个数字

    盛水最多的容器 (1)暴力解法   算法思路:我们枚举出所有的容器大小,取最大值即可。   容器容积的计算方式:   设两指针 i , j ,分别指向水槽板的最左端以及最右端,此时容器的宽度为 j - i 。由于容器的高度由两板中的较短的板决定,因此可得容积公式 :

    2024年02月13日
    浏览(37)
  • 剑指offer(C++)-JZ56:数组中只出现一次的两个数字(算法-位运算)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 一个整型数组里除了两个数字只出现一次,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 数据范围:数组长度2≤n≤1000,数组中每个数

    2024年02月10日
    浏览(38)
  • 剑指 Offer 59 - I. 滑动窗口的最大值 / LeetCode 239. 滑动窗口最大值(优先队列 / 单调队列)

    链接:剑指 Offer 59 - I. 滑动窗口的最大值;LeetCode 239. 滑动窗口最大值 难度:困难 下一篇:剑指 Offer 59 - II. 队列的最大值(单调队列) 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗

    2024年02月15日
    浏览(30)
  • 《剑指 Offer》专项突破版 - 面试题 47 : 二叉树剪枝(C++ 实现)

    题目链接 :LCR 047. 二叉树剪枝 - 力扣(LeetCode) 题目 : 一棵二叉树的所有节点的值要么是 0 要么是 1,请剪除该二叉树中 所有节点的值全都是 0 的子树 。例如,在剪除下图 (a) 中二叉树中所有节点值都为 0 的子树之后的结果如下图 (b) 所示。 分析 : 首先分析哪些子树会被

    2024年02月20日
    浏览(29)
  • 《剑指 Offer》专项突破版 - 面试题 4 : 只出现一次的数字(C++ 实现)

    题目链接 :137. 只出现一次的数字 II - 力扣(LeetCode) 题目 : 输入一个整数数组,数组中只有一个数字出现了一次,而其他数字都出现了 3 次。请找出那个只出现一次的数字。例如,如果输入的数组为 [0, 1, 0, 1, 0, 1, 100],则只出现一次的数字是 100。 分析 : 这个题目有一个

    2024年02月02日
    浏览(35)
  • 《剑指 Offer》专项突破版 - 面试题 15 : 字符串中的所有变位词(C++ 实现)

    题目链接 :LCR 015. 找到字符串中所有字母异位词 - 力扣(LeetCode) 题目 : 输入字符串 s1 和 s2,如何找出字符串 s2 的所有变位词在字符串 s1 中的起始下标?假设两个字符串中只包含英文小写字母。例如,字符串 s1 为 \\\"cbadabacg\\\",字符串 s2 为 \\\"abc\\\",字符串 s2 的两个变位词 \\\"c

    2024年01月18日
    浏览(42)
  • 《剑指 Offer》专项突破版 - 面试题 13 : 二维子矩阵的数字之和(C++ 实现)- 二维前缀和

    题目链接 :LCR 013. 二维区域和检索 - 矩阵不可变 - 力扣(LeetCode) 题目 : 输入一个二维矩阵,如何计算给定左上角坐标和右下角坐标的子矩阵的数字之和?对于同一个二维矩阵,计算子矩阵的数字之和的函数可能由于输入不同的坐标而反复调用多次。 例如,对于下图中的二

    2024年01月18日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包