第04課丨01棧和隊(duì)列的實(shí)現(xiàn)與特性

一给涕、棧和隊(duì)列的結(jié)構(gòu)

棧(先進(jìn)后出的容器)
隊(duì)列(先進(jìn)先出够庙,依次排列)

需要牢記的關(guān)鍵點(diǎn)

  • Stack:先進(jìn)后出(FILO);添加昼榛、刪除皆為O(1)胆屿,查詢是O(n)
  • Queue:先進(jìn)先出;添加非迹、刪除皆為O(1)憎兽,查詢是O(n)

小結(jié):

所有的東西,都是現(xiàn)實(shí)中已有的邏輯纯命,我們進(jìn)行一個(gè)抽象,然后用計(jì)算機(jī)語(yǔ)言來(lái)進(jìn)行表達(dá):

  • 如果一個(gè)問(wèn)題亿汞,具有所謂的最近相關(guān)性 ---> 用來(lái)解決疗我。(最近相關(guān)性:很多現(xiàn)實(shí)的問(wèn)題,反映到工程里面碍粥,都具有這種從外向內(nèi)或者從內(nèi)向外逐漸擴(kuò)散嚼摩,最外層與最外層是一對(duì)枕面,最內(nèi)層與最內(nèi)層是一對(duì))
  • 還有一種就是先來(lái)后到缚去,講所謂的公平性 ---> 用隊(duì)列來(lái)解決

某些時(shí)候解決一些特殊的問(wèn)題

  • 只用棧實(shí)現(xiàn)隊(duì)列 ---> 用兩個(gè)棧
  • 只用隊(duì)列實(shí)現(xiàn)棧 ---> 用兩個(gè)隊(duì)列

棧附例
leetcode20 有效的括號(hào)

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. 柱狀圖中最大的矩形

二枕荞、雙端隊(duì)列(Deque - double ended queue)

  1. 理解為Queue和Stack的結(jié)合體躏精,兩端可以進(jìn)出的Queue,
  2. 插入和刪除都是O(1)操作矗烛;查詢是O(n)的瞭吃,因?yàn)檫@個(gè)元素是沒(méi)有任何順序的
雙端隊(duì)列

雙端隊(duì)列附例:
leetcode 滑動(dòng)窗口最大值 239?leetcode-cn.com

# 所有滑動(dòng)窗口的題目歪架,用雙端隊(duì)列去處理就行了开泽。
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的工程實(shí)現(xiàn)

  • Java泣崩、Python、c++等已有基礎(chǔ)實(shí)現(xiàn)
# Stack的Python實(shí)現(xiàn)及常用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實(shí)現(xiàn)及常用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接口調(diào)用及常用API
Queue的Java接口調(diào)用及常用API
Deque的Java接口調(diào)用及常用API

四烘跺、優(yōu)先隊(duì)列(Priority queue)

優(yōu)先隊(duì)列也是一個(gè)接口脂崔,或者是定義的一種抽象的數(shù)據(jù)結(jié)構(gòu)砌左,底層有很多不同的實(shí)現(xiàn)。

  • 插入操作是O(1)

  • 取出操作是O(logN) - 按照元素的優(yōu)先級(jí)取出

  • 底層具體實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu)較為多樣和復(fù)雜:

  • heap(多種形式實(shí)現(xiàn)的文搂,不一定是二叉樹(shù))

  • bst(binary search tree) ---> 二叉搜索樹(shù)秤朗、也可以是平衡二叉樹(shù)實(shí)現(xiàn)取视,比如紅黑樹(shù)、AVL

  • treap(高級(jí)數(shù)據(jù)結(jié)構(gòu))


小結(jié)

  1. Stack稽物、Queue折欠、Deque的原理和操作復(fù)雜度
  2. PriorityQueue的特點(diǎn)和操作復(fù)雜度
  3. 查詢Stack、Queue咪奖、Deque羊赵、PriorityQueue的系統(tǒng)接口的方法

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

兩個(gè)棧實(shí)現(xiàn)隊(duì)列+兩個(gè)隊(duì)列實(shí)現(xiàn)棧----java

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末昧捷,一起剝皮案震驚了整個(gè)濱河市靡挥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌跋破,老刑警劉巖贮泞,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異幔烛,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)囊蓝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)饿悬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人聚霜,你說(shuō)我怎么就攤上這事狡恬。” “怎么了蝎宇?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵弟劲,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我姥芥,道長(zhǎng)凉唐,這世上最難降的妖魔是什么淡溯? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任米间,我火速辦了婚禮屈糊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘谦去。我一直安慰自己鳄哭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著药有,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宦言。 梳的紋絲不亂的頭發(fā)上奠旺,一...
    開(kāi)封第一講書(shū)人閱讀 49,079評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音稽寒,去河邊找鬼慎王。 笑死,一個(gè)胖子當(dāng)著我的面吹牛谅河,可吹牛的內(nèi)容都是我干的吐限。 我是一名探鬼主播诸典,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼胆数,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蒋搜!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起骂租,我...
    開(kāi)封第一講書(shū)人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤宿刮,失蹤者是張志新(化名)和其女友劉穎胡桃,沒(méi)想到半個(gè)月后翠胰,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體斤富,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡轻纪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了衬以。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖冯勉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情交胚,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站荡澎,受9級(jí)特大地震影響彤委,放射性物質(zhì)發(fā)生泄漏焦影。R本人自食惡果不足惜斯辰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蒲跨,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至户侥,卻和暖如春蕊唐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留糠睡,地道東北人信认。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像护蝶,于是被迫代替她去往敵國(guó)和親负饲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345