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

一、栈和队列的结构

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

需要牢记的关键点

  • 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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,607评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,239评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,960评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,750评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,764评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,604评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,347评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,253评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,702评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,893评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,015评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,734评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,352评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,934评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,052评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,216评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,969评论 2 355