數據結構】棧

      網友投稿 715 2025-03-31

      什么是棧

      LIFO:后進者先出,先進者后出

      “操作受限”的線性表,只允許在一端插入和刪除數據。

      理解:一摞疊在一起的盤子。我們平時放盤子的時候,都是從下往上一個一個放;取的時候,我們也是從上往下一個一個地依次取,不能從中間任意抽出。

      棧操作

      Stack() 創建一個空的新棧。 它不需要參數,并返回一個空棧。

      push(item)將一個新項添加到棧的頂部。它需要 item 做參數并不返回任何內容。

      pop() 從棧中刪除頂部項。它不需要參數并返回 item 。棧被修改。

      peek() 從棧返回頂部項,但不會刪除它。不需要參數。 不修改棧。

      is_empty() 測試棧是否為空。不需要參數,并返回布爾值。

      size() 返回棧中的 item 數量。不需要參數,并返回一個整數。

      python實現

      【數據結構】棧

      1.利用列表自定義

      class Stack(object): #底層數據結構為列表 def __init__(self): self.stack = [] def push(self, value): # 入棧 self.stack.append(value) def pop(self): # 彈出棧頂元素 if self.stack: self.stack.pop() else: raise LookupError('stack is empty!') def is_empty(self): # 判斷棧是否為空 return bool(self.stack) def peek(self): # 獲取目前stack中最新的元素 return self.stack[-1] def size(self): # 返回棧的元素個數 return len(self.stack)

      2.利用鏈表自定義

      class Node(object): """節點的實現""" def __init__(self,elem): self.elem = elem self.next = None class Stack(object): def __init__(self): """ 初始化,鏈表頭head""" self.__head = None def is_empty(self): """ 初始化,鏈表頭head""" return self.__head is None def push(self,item): """ 壓棧""" node = Node(item) node.next = self.__head self.__head = node def pop(self): """ 彈棧""" if self.is_empty(): return else: p = self.__head self.__head = p.next return p.elem

      3.queue模塊

      內部也是用的列表,方法繼承自queue,支持線程安全

      (這里不做多講解,【python】queue模塊已講解)

      import queue stack = queue.LifoQueue() # 內部使用列表;

      棧的實際應用

      括號匹配問題

      給定一個只包括?(,),{,},[,]?的字符串,判斷字符串是否有效。有效字符串需滿足:1、左括號必須用相同類型的右括號閉合。2、左括號必須以正確的順序閉合。注意空字符串可被認為是有效字符串。

      def brace_match(s): match = {'}':'{', ')':'(', ']':'['} stack = Stack() for ch in s: if ch in ['(', '[', '{']: stack.push(ch) else: if stack.is_empty(): return False elif stack.peek() == match[ch]: stack.pop() else: return False return True if stack.is_empty() else False

      迷宮問題

      返回從入口發到出口的迷宮路徑

      # 迷宮問題:深度優先搜索 maze = [ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 1, 0, 0, 0, 0, 0, 0, 1], [1, 0, 1, 0, 1, 0, 1, 1, 0, 1], [1, 0, 1, 0, 1, 0, 1, 1, 0, 1], [1, 0, 0, 0, 1, 0, 0, 1, 0, 1], [1, 1, 1, 0, 1, 1, 1, 1, 0, 1], [1, 1, 1, 0, 1, 1, 0, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1, 1, 0, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], ] dirs = [ lambda x, y: (x+1, y), lambda x, y: (x, y+1), lambda x, y: (x-1, y), lambda x, y: (x, y-1), ] def maze_path(x1,y1,x2,y2): stack = [] stack.append((x1, y1)) while len(stack)>0: curNode = stack[-1] if curNode == (x2,y2): print(stack) return True for dir in dirs: nextNode = dir(curNode[0], curNode[1]) if maze[nextNode[0]][nextNode[1]] == 0: stack.append(nextNode) maze[nextNode[0]][nextNode[1]] = 2 break else: maze[nextNode[0]][nextNode[1]] = 2 # 表示走過 stack.pop() else: return False maze_path(1,1,8,8)

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:excel編輯欄提供什么功能(excel編輯欄的功能)
      下一篇:Excel中的多個單元格中快速插入項目符號或編號
      相關文章
      日本亚洲免费无线码| 亚洲人成在线观看| 亚洲最大在线视频| 亚洲av无码av制服另类专区| 国产偷国产偷亚洲高清日韩| 亚洲精品成人a在线观看| 黑人粗长大战亚洲女2021国产精品成人免费视频 | 亚洲日韩欧洲无码av夜夜摸| 亚洲精品无码你懂的网站| 一本色道久久88综合亚洲精品高清| 麻豆亚洲AV成人无码久久精品 | 亚洲精品国产精品乱码不卡| 亚洲成人一区二区| 亚洲免费无码在线| 亚洲国产精品丝袜在线观看| 亚洲精品无码你懂的网站| 久久久亚洲精品蜜桃臀 | 亚洲一级黄色大片| 亚洲无吗在线视频| 亚洲人成人伊人成综合网无码| 亚洲国产AV一区二区三区四区| AV激情亚洲男人的天堂国语| 亚洲国产av无码精品| 久久久久亚洲av成人无码电影| 亚洲精品无码mv在线观看网站| 好看的亚洲黄色经典| 亚洲日本中文字幕区| 亚洲系列国产精品制服丝袜第| 亚洲国产午夜电影在线入口| 亚洲宅男精品一区在线观看| 亚洲欧洲国产综合AV无码久久| 国产精品亚洲lv粉色| 亚洲午夜爱爱香蕉片| 国产亚洲精品成人a v小说| 国产精品亚洲а∨无码播放 | 亚洲精品V天堂中文字幕| 日韩精品成人亚洲专区| 国产亚洲精午夜久久久久久| 亚洲AV无码久久精品色欲| 亚洲综合区图片小说区| 亚洲精品无码专区久久|