10.Stack-Queue-Priority_queue

1.Stack

一些接口介绍:
1.top():返回栈顶元素的引用
2.push():将元素val压入stack中
3.pop():将stack中尾部的元素弹出

1.1 最小栈

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

实现 MinStack 类:

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。

1. 0<=pushV.length == popV.length <=1000

2. -1000<=pushV[i]<=1000

3. pushV 的所有数字均不相同

  • MinStack() 初始化堆栈对象。
  • void push(int val) 将元素val推入堆栈。
  • void pop() 删除堆栈顶部的元素。
  • int top() 获取堆栈顶部的元素。
  • int getMin() 获取堆栈中的最小元素。
  • 思路:创建两个栈,其中一个用来记录最小值;注意边界条件数值相等时
    也要进/出最小栈;考虑为空情况
    

  • 1.2栈的压入、弹出序列

  • 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。

    1. 0<=pushV.length == popV.length <=1000

    2. -1000<=pushV[i]<=1000

    3. pushV 的所有数字均不相同

思路:
1.入栈序列入栈
2.持续比较栈顶数据和出栈序列,直到栈为空/不匹配

      1.3模拟实现stack:

        2.Queue

        一些接口介绍:
        1.front() 返回队头元素的引用
        2.back() 返回队尾元素的引用
        3.push() 在队尾将元素val入队列

        2.1模拟实现queue

        3.Priority_queue(优先级队列)

        3.1简介:

        1. 优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素
        中最大的。
        2. 此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶
        部的元素)。
        3. 优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue
        提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的
        顶部。
        4. 底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。容器应该可以通过
        随机访问迭代器访问,并支持以下操作:
        empty():检测容器是否为空
        size():返回容器中有效元素个数
        front():返回容器中第一个元素的引用
        push_back():在容器尾部插入元素
        pop_back():删除容器尾部元素
        5. 标准容器类vector和deque满足这些需求。默认情况下,如果没有为特定的priority_queue
        类实例化指定容器类,则使用vector。
        6. 需要支持随机访问迭代器,以便始终在内部保持堆结构。容器适配器通过在需要时自动调用算法函数make_heap、push_heap和pop_heap来自动完成此操作。

        3.2 priority_queue的使用

        优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中
        元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用
        priority_queue。注意:默认情况下priority_queue是大堆。

        3.3模拟实现priority_queue

        4.容器适配器

        4.1简介:

        适配器是一种设计模式该种模式是将一个类的接口转换成客户希望的另外一个接口 (Stack-Queue-Priority_queue三者底层都是容器适配器(六大组件之一))

        4.2 deque的简单介绍(了解)

        4.2.1 deque 的原理(可以理解为list和vector的融合,但有缺陷)
        deque( 双端队列 ) :是一种双开口的 " 连续 " 空间的数据结构 ,双开口的含义是:可以在头尾两端
        进行插入和删除操作,且时间复杂度为 O(1) ,与 vector 比较,头插效率高,不需要搬移元素;与
        list 比较,空间利用率比较高。
        deque 并不是真正连续的空间,而是由一段段连续的小空间拼接而成的,实际 deque 类似于一个

        动态的二维数组

        双端队列底层是一段假象的连续空间,实际是分段连续的,为了维护其 整体连续 以及随机访问
        的假象,落在了 deque 的迭代器身上, 因此 deque 的迭代器设计就比较复杂,如下图所示:

         

        deque 缺陷:不适合遍历,因为在遍历时, deque 的迭代器要频繁的去检测其 是否移动到某段小空间的边界,导致效率低下
        评论
        添加红包

        请填写红包祝福语或标题

        红包个数最小为10个

        红包金额最低5元

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

        抵扣说明:

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

        余额充值