美文网首页
第04课丨01栈和队列的实现与特性

第04课丨01栈和队列的实现与特性

作者: 阳明AI | 来源:发表于2020-06-30 00:22 被阅读0次

一、栈和队列的结构

栈(先进后出的容器) 队列(先进先出,依次排列)

需要牢记的关键点

  • Stack:先进后出(FILO);添加、删除皆为O(1),查询是O(n)
  • Queue:先进先出;添加、删除皆为O(1),查询是O(n)

小结:

所有的东西,都是现实中已有的逻辑,我们进行一个抽象,然后用计算机语言来进行表达:

  • 如果一个问题,具有所谓的最近相关性 ---> 用来解决。(最近相关性:很多现实的问题,反映到工程里面,都具有这种从外向内或者从内向外逐渐扩散,最外层与最外层是一对,最内层与最内层是一对)
  • 还有一种就是先来后到,讲所谓的公平性 ---> 用队列来解决

某些时候解决一些特殊的问题

  • 只用栈实现队列 ---> 用两个栈
  • 只用队列实现栈 ---> 用两个队列

栈附例
leetcode20 有效的括号

class Solution:
    def isValid(self, s: str) -> bool:
        stack, match = [], {')': '(', ']': '[', '}': '{'}
        for ch in s:
            if ch in match:
                if not (stack and stack.pop() == match[ch]):
                    return False
            else:
                stack.append(ch)
        return not stack

155. 最小栈

class MinStack(object):

    def __init__(self):
        """
        initialize your data structure here.
        """
        self.stack = []
        

    def push(self, x):
        """
        :type x: int
        :rtype: void
        """
        if not self.stack:
            self.stack.append((x, x))
        else:
            self.stack.append((x, min(x, self.stack[-1][1])))
        

    def pop(self):
        """
        :rtype: void
        """
        self.stack.pop()
        

    def top(self):
        """
        :rtype: int
        """
        return self.stack[-1][0]
        

    def getMin(self):
        """
        :rtype: int
        """
        return self.stack[-1][1]

84. 柱状图中最大的矩形

二、双端队列(Deque - double ended queue)

  1. 理解为Queue和Stack的结合体,两端可以进出的Queue,
  2. 插入和删除都是O(1)操作;查询是O(n)的,因为这个元素是没有任何顺序的
双端队列

双端队列附例:
leetcode 滑动窗口最大值 239​leetcode-cn.com

# 所有滑动窗口的题目,用双端队列去处理就行了。
class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        deque = collections.deque()
        res = []
        for i, num in enumerate(nums):
            while deque and deque[0] <= i - k: deque.popleft()
            while deque and num > nums[deque[-1]]: deque.pop()
            deque.append(i)
            if i >= k - 1:
                res.append(nums[deque[0]])
        return res

三、Stack、Queue、Deque的工程实现

  • Java、Python、c++等已有基础实现
# Stack的Python实现及常用API
class Stack:
    def __init__(self):
        self.items = ["x","y"]
    def push(self,item):
        self.items.append(item)
    def pop(self):
        self.items.pop()
    def length(self):
        return len(self.items)

# Queue的Python实现及常用API
class Queue:
    def __init__(self):
        self.queue = []
    def enqueue(self,item):
        self.queue.append(item)
    def dequeue(self):
        if len(self.queue)<1:
            return None
        return self.queue.pop(0)
    def size(self):
        return len(self.queue)
  • 如何查询接口信息?如何使用?(Java 举例)
Stack的Java接口调用及常用API Queue的Java接口调用及常用API Deque的Java接口调用及常用API

四、优先队列(Priority queue)

优先队列也是一个接口,或者是定义的一种抽象的数据结构,底层有很多不同的实现。

  • 插入操作是O(1)

  • 取出操作是O(logN) - 按照元素的优先级取出

  • 底层具体实现的数据结构较为多样和复杂:

  • heap(多种形式实现的,不一定是二叉树)

  • bst(binary search tree) ---> 二叉搜索树、也可以是平衡二叉树实现,比如红黑树、AVL

  • treap(高级数据结构)


小结

  1. Stack、Queue、Deque的原理和操作复杂度
  2. PriorityQueue的特点和操作复杂度
  3. 查询Stack、Queue、Deque、PriorityQueue的系统接口的方法

https://netdisk-pan.baidupcs.com/disk/docview?bdstoken=aaaf578043f6f35ad0f93b17e69de253&uk=3005818708&path=%2F%E6%88%91%E7%9A%84%E8%B5%84%E6%BA%90%2F%E6%9E%81%E5%AE%A2%E5%A4%A7%E5%AD%A6%E7%AE%97%E6%B3%95%E8%AE%AD%E7%BB%83%E8%90%A5%2F%E6%9E%81%E5%AE%A2%E5%A4%A7%E5%AD%A6-%E7%AE%97%E6%B3%95%E8%AE%AD%E7%BB%83%E8%90%A5%E7%AC%AC%E5%9B%9B%E6%9C%9F%2F%E7%AC%AC04%E8%AF%BE%E4%B8%A8%E6%A0%88%E3%80%81%E9%98%9F%E5%88%97%E3%80%81%E4%BC%98%E5%85%88%E9%98%9F%E5%88%97%E3%80%81%E5%8F%8C%E7%AB%AF%E9%98%9F%E5%88%97%2F%E7%AC%AC04%E8%AF%BE%E4%B8%A801%E6%A0%88%E5%92%8C%E9%98%9F%E5%88%97%E7%9A%84%E5%AE%9E%E7%8E%B0%E4%B8%8E%E7%89%B9%E6%80%A7.docx&share=0

image.png

两个栈实现队列+两个队列实现栈----java

相关文章

  • 38_两个有趣的问题

    关键词:通过栈实现队列、通过队列实现栈 0. 通过栈实现队列 用栈实现队列等价于用后进先出的特性实现先进先出的特性...

  • 第04课丨01栈和队列的实现与特性

    一、栈和队列的结构 需要牢记的关键点: Stack:先进后出(FILO);添加、删除皆为O(1),查询是O(n) ...

  • Swift 队列&栈 相关操作

    栈 LIFO(后进先出) 队列 FIFO(先进先出) 队列与栈相互的实现 栈 - 队列实现 队列 - 栈实现 相关...

  • 数据结构——栈和队列

    用数组实现栈和队列 用栈实现队列 用队列实现栈 栈和队列的经典算法题最小间距栈宠物收养所 数组实现栈和队列 用数组...

  • 算法:使用栈实现队列

    分析 栈的特性后入先出,队列的特性是先入先出,要用栈去实现一个队列,就要思考如果将一个栈转换成队列的特性。 举个例...

  • Algorithm小白入门 -- 队列和栈

    队列和栈队列实现栈、栈实现队列单调栈单调队列运用栈去重 1. 队列实现栈、栈实现队列 队列是一种先进先出的数据结构...

  • 算法-栈和队列的实现与特性

    栈:先进后出 stack:添加和删除为O(1),查询为O(n) 队列:先进先出 queue:添加和删除为O(1),...

  • 实 验 四 栈和队列

    一、实验目的与要求:## 1、理解栈和队列抽象数据类型。 2、掌握栈和队列的存储结构和操作实现。 3、理解栈和队列...

  • 算法-栈和队列算法总结

    栈和队列算法总结 1 模拟 1.1 使用栈实现队列 1.2 使用队列实现栈 2 栈的应用 2.1 栈操作 2.2 ...

  • 04、栈、队列、双端队列、优先队列

    栈和队列的基本实现和特性 小结 Stack、Queue、Deque 的原理和操作复杂度 PriorityQueue...

网友评论

      本文标题:第04课丨01栈和队列的实现与特性

      本文链接:https://www.haomeiwen.com/subject/kywzfktx.html