【Python 數據結構 5.棧】

目錄

一、棧的基本概念

1.棧的概念

2.入棧

入棧的步驟

3.出棧

出棧的步驟

4.獲取棧頂元素

獲取棧頂元素的步驟

二、 Python中的棧

順序表實現

鏈表實現

三、棧的實戰

1.LCR 123. 圖書整理 I

思路與算法

2.LCR 027. 回文鏈表

思路與算法

3.1614. 括號的最大嵌套深度

思路與算法

四、棧的應用


輕舟快船,祝你好過春山

????????????????????????????????—— 25.3.3

一、棧的基本概念

1.棧的概念

????????棧是僅限在表尾進行插入和刪除的線性表,它遵循后進先出(Last-In-First-Out,LIFO)的原則。棧可以類比為一疊盤子,你只能訪問頂部的盤子,而添加或刪除盤子只能在頂部進行。在計算機科學中,棧通常用于實現:函數調用、遞歸、表達式求值 等操作。我們一般可以用 順序表 或者 鏈表 來實現棧。


2.入棧

????????棧元素的插入操作叫做入棧,也可稱為進棧、壓棧。直接將元素添加到棧的頂部即可。這個操作類似于將盤子添加到疊盤子的頂部。

入棧的步驟

第1步:將元素壓入棧中,并將棧頂指針 或 索引指向新的棧頂元素。

第2步:棧的大小增加了 1,頂部元素為剛剛入棧的元素。


3.出棧

????????棧元素的刪除操作叫做出棧,也可稱為彈棧。直接將棧的頂部元素刪除即可。這個操作類似于將疊盤子的頂部的盤子拿走的過程。

出棧的步驟

第1步:將棧頂元素刪除掉,并將棧頂指針或索引指向新的頂元素。

第2步:棧的大小減小了 1。


4.獲取棧頂元素

????????返回棧頂元素的值,無論是鏈表還是順序表,都可以通過棧頂指針在 O(1) 的時間復雜度獲取到棧頂元素。

獲取棧頂元素的步驟

第1步:利用棧頂指針獲取棧頂元素,由于是查詢操作,所以不會改變棧本身的數據


二、 Python中的棧

順序表實現

class Stack:def __init__(self):self.data = []# 入棧操作 直接相當于列表的append操作def push(self, val):self.data.append(val)# 出棧操作 直接相當于列表的pop操作def pop(self):if self.empty():return "Stach is empty"return self.data.pop()# 獲取棧頂元素 直接相當于列表的索引[-1]操作def top(self):if self.empty():return "Stach is empty"return self.data[-1]def size(self):return len(self.data)def empty(self):return len(self.data) == 0def test():stack = Stack()stack.push(1)stack.push(2)stack.push(3)stack.push(4)while not stack.empty():print(f'Top element: {stack.top()}')print(f'Size of stack: {stack.size()}')print(f'Popped element: {stack.pop()}')print(f'Size of stack: {stack.size()}')print("————————————————————————————")
test()

?


鏈表實現

class Node:def __init__(self, val):self.val = valself.next = Noneclass Stack:def __init__(self):self.head = Noneself.len = 0# 入棧操作 直接相當于鏈表的頭插法def push(self, val):new_node = Node(val)new_node.next = self.headself.head = new_nodeself.len += 1# 出棧操作def pop(self):if self.empty():return "St ack is empty"val = self.head.valself.head = self.head.nextself.len -= 1return val# 獲取棧頂元素 相當于直接返回鏈表的頭節點def top(self):if self.empty():return "Stach is empty"return self.head.valdef size(self):return self.lendef empty(self):return self.len == 0def test():stack = Stack()stack.push(1)stack.push(2)stack.push(3)stack.push(4)while not stack.empty():print(f'Top element: {stack.top()}')print(f'Size of stack: {stack.size()}')print(f'Popped element: {stack.pop()}')print(f'Size of stack: {stack.size()}')print("————————————————————————————")
test()


三、棧的實戰

1.LCR 123. 圖書整理 I

書店店員有一張鏈表形式的書單,每個節點代表一本書,節點中的值表示書的編號。為更方便整理書架,店員需要將書單倒過來排列,就可以從最后一本書開始整理,逐一將書放回到書架上。請倒序返回這個書單鏈表。

示例 1:

輸入:head = [3,6,4,1]輸出:[1,4,6,3]

提示:

0 <= 鏈表長度 <= 10000

思路與算法

Ⅰ、棧的使用:代碼中使用了棧(Stack)這一數據結構。棧的特點是“后進先出”(LIFO),即最后入棧的元素會最先出棧。利用這一特性,可以將鏈表中的值依次壓入棧中,然后再依次彈出,從而實現反轉的效果。

Ⅱ、遍歷鏈表:代碼首先通過一個?while?循環遍歷鏈表,將每個節點的值?head.val?壓入棧中。遍歷結束后,棧中存儲了鏈表所有節點的值,且順序與鏈表中的順序相反。

Ⅲ、反轉并生成結果:接著,代碼通過另一個?while?循環將棧中的元素依次彈出,并追加到結果列表?res?中。由于棧的 LIFO 特性,彈出的順序與壓入的順序相反,因此?res?中的元素順序與鏈表中的順序相反,實現了反轉的效果。?

Ⅳ、返回結果:最后,代碼返回?res,即反轉后的鏈表值列表。

列表.append():用于在列表的末尾添加一個元素。它會直接修改原列表,而不是返回一個新的列表。

參數名說明是否必填
element要添加到列表末尾的元素

列表.pop():用于從列表中移除并返回指定索引處的元素。如果不指定索引,默認移除并返回最后一個元素。

參數名說明是否必填
index要移除的元素的索引(從0開始)
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def reverseBookList(self, head: Optional[ListNode]) -> List[int]:# 用Python實現數據結構——棧Stack = []res = []while head != None:Stack.append(head.val)head = head.nextwhile len(Stack) > 0:res.append(Stack.pop())return res


2.LCR 027. 回文鏈表

給定一個鏈表的?頭節點?head?,請判斷其是否為回文鏈表。

如果一個鏈表是回文,那么鏈表節點序列從前往后看和從后往前看是相同的。

示例 1:

輸入: head = [1,2,3,3,2,1]
輸出: true

示例 2:

輸入: head = [1,2]
輸出: false

提示:

  • 鏈表 L 的長度范圍為?[1, 105]
  • 0?<= node.val <= 9?

思路與算法

Ⅰ、使用棧存儲鏈表的值:首先,函數通過遍歷鏈表,將每個節點的值依次壓入棧?Stack?中。由于棧是“后進先出”的數據結構,因此棧中存儲的節點順序是鏈表節點值的逆序。

Ⅱ、比較鏈表與棧中的值:接著,函數再次遍歷鏈表,同時從棧中彈出元素,將鏈表節點的值與棧中彈出的值進行比較。如果所有值都匹配,則鏈表是回文鏈表;否則,鏈表不是回文鏈表。

列表.append():用于在列表的末尾添加一個元素。它會直接修改原列表,而不是返回一個新的列表。

參數名說明是否必填
element要添加到列表末尾的元素

列表.pop():用于從列表中移除并返回指定索引處的元素。如果不指定索引,默認移除并返回最后一個元素。

參數名說明是否必填
index要移除的元素的索引(從0開始)
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def isPalindrome(self, head: ListNode) -> bool:# 列表逆序也可以用棧Stack = []tmp = headwhile tmp != None:Stack.append(tmp.val)tmp = tmp.nextwhile head:if head.val != Stack.pop():return Falsehead = head.nextreturn True 


3.1614. 括號的最大嵌套深度

給定?有效括號字符串?s,返回?s?的?嵌套深度。嵌套深度是嵌套括號的?最大?數量。

示例 1:

輸入:s = "(1+(2*3)+((8)/4))+1"

輸出:3

解釋:數字 8 在嵌套的 3 層括號中。

示例 2:

輸入:s = "(1)+((2))+(((3)))"

輸出:3

解釋:數字 3 在嵌套的 3 層括號中。

示例 3:

輸入:s = "()(())((()()))"

輸出:3

提示:

  • 1 <= s.length <= 100
  • s?由數字?0-9?和字符?'+''-''*''/''('')'?組成
  • 題目數據保證括號字符串?s?是?有效的括號字符串

思路與算法

初始化top?初始化為 0,表示當前嵌套深度為 0。res?初始化為 0,用于記錄最大嵌套深度。

遍歷字符串:對于字符串中的每個字符?x:如果?x?是 "(",表示進入一個新的嵌套層級,因此?top?增加 1,并更新?res?為?max(res, top),以確保?res?始終記錄最大深度。如果?x?是?")",表示退出當前嵌套層級,因此?top?減少 1。

返回結果:遍歷結束后,res?即為字符串中嵌套括號的最大深度。

class Solution:def maxDepth(self, s: str) -> int:top = 0res = 0for x in s:if x == "(":top += 1res = max(res, top)elif x == ")":top -= 1return res


四、棧的應用

在打開界面的情況下,打開了一個子界面,關閉子界面,一開始打開的界面還在

打開界面的操作是將界面放在一個棧中,關閉界面的操作就是將界面從棧中移出來,關閉的永遠是棧頂部的界面,也就是所謂的 “棧頂” 元素

棧是一個先進后出的數據結構

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/71243.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/71243.shtml
英文地址,請注明出處:http://en.pswp.cn/web/71243.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Machine Learning 初探

前置知識 pandas 讀取文件&#xff1a;read_csv查看信息 describe&#xff1a;查看整體信息&#xff0c;包括每列的平均值、最大最小值、標準差等head&#xff1a;輸出頭部幾行數據columns&#xff1a;輸出所有列名loc&#xff1a;查詢數據&#xff0c;或是根據索引取對應的數…

2025年2月個人工作生活總結

本文為 2025年2月工作生活總結。 工作記錄 AI浪潮 AI非常火&#xff0c;春節至今&#xff0c;到處充斥著大量和AI、DeepSeek有關的新聞。領導也一再強調要用AI&#xff0c;甚至納入到新一年的考核里。再往上&#xff0c;大領導開會的新聞稿里也作出要求&#xff0c;不能停下腳…

SpringBoot @ConfigurationProperties 注解使用

ConfigurationProperties 用于將配置文件&#xff08;如 application.properties 或 application.yml&#xff09;中的屬性批量綁定到一個 Java Bean 中。 1. 定義配置文件 在 application.properties 或 application.yml 中定義一組具有相同前綴的屬性。 application.yml &a…

剛安裝docker并啟動docker服務: systemctl restart docker報錯解決

root:/home/lzw# sudo systemctl restart docker Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xeu docker.service" for details. 1、問題描述 啟動doc…

JavaScript的this指向,一次徹底講清楚

JavaScript 中的 this 指向是一個非常重要且容易混淆的概念。它的值取決于函數被調用的上下文,而不是函數定義的位置。以下是 this 指向的詳細解析: 1. 默認綁定(Default Binding) 在非嚴格模式下,如果函數是直接調用(而不是作為對象的方法或構造函數等),this 默認指向…

MFC: 控件根據文本內容大小自動調整

背景&#xff1a; 針對不同語言下&#xff0c;控件顯示不全的現象&#xff1b; 例如&#xff1a; 現象1&#xff1a;中文下顯示全部信息&#xff0c;英語下只能顯示部分文字 現象2&#xff1a;中文下顯示不全## 實現思路&#xff1a; 控件綁定按鈕計算控件文本長度根據文本長…

SpringBoot 整合mongoDB并自定義連接池,實現多數據源配置

要想在同一個springboot項目中使用多個數據源&#xff0c;最主要是每個數據源都有自己的mongoTemplate和MongoDbFactory。mongoTemplate和MongoDbFactory是負責對數據源進行交互的并管理鏈接的。 spring提供了一個注解EnableMongoRepositories 用來注釋在某些路徑下的MongoRepo…

軟件測試中的BUG

文章目錄 軟件測試的生命周期BugBug 的概念描述 Bug 的要素案例Bug 級別Bug 的生命周期與開發產生爭執怎么辦&#xff1f;【高頻面試題】先檢查自身&#xff0c;Bug 是否描述的不清楚站在用戶角度考慮并拋出問題Bug 的定級要有理有據提?自身技術和業務水平&#xff0c;做到不僅…

泵吸式激光可燃氣體監測儀:快速精準守護燃氣管網安全

在城市化進程加速的今天&#xff0c;燃氣泄漏、地下管網老化等問題時刻威脅著城市安全。如何實現精準、高效的可燃氣體監測&#xff0c;守護“城市生命線”&#xff0c;成為新型基礎設施建設的核心課題。泵吸式激光可燃氣體監測儀&#xff0c;以創新科技賦能安全監測&#xff0…

第J3-1周:DenseNet算法 實現乳腺癌識別

文章目錄 一、前言二、前期準備1.設置GPU2.劃分數據集 三、搭建網絡模型1.DenseLayer模塊2.DenseBlock模塊3.Transition模塊4.構建DenseNet5.構建densenet121 四、訓練模型1.編寫訓練函數2.編寫測試函數3.正式訓練 五、結果可視化1.Loss與Accuracy圖2.模型評估 總結&#xff1a…

【JAVA面試題】== 和 equals() 的區別與使用場景

在 Java 面試中&#xff0c; 和 equals() 的區別是一個高頻考點。理解它們的底層原理和使用場景&#xff0c;對于掌握 Java 基礎知識至關重要。本文將從 基本概念、底層實現 和 實際應用 三個方面&#xff0c;深入解析 和 equals() 的區別。 1. 基本概念 1.1 運算符 作用&a…

-bash: lsof: command not found

一、問題說明 執行如下命令時報錯&#xff1a; # lsof |grep deleted > deleted_file -bash: lsof: command not found二、處理方法 # yum -y install lsof安裝完成后可成功執行上面的命令。

攝像頭應用編程(三):多平面視頻采集

文章目錄 1、前言2、環境介紹3、步驟4、應用程序編寫5、測試5.1、編譯應用程序5.2、運行應用程序 6、總結 1、前言 在查看攝像頭類型時&#xff0c;大致可以分為兩類&#xff1a;Video Capture 和 Video Capture Multiplanar。 本次應用程序主要針對類型為Video Capture Multi…

本地部署 Traefik 的完整教程

Traefik 是一款現代化的反向代理和負載均衡工具,專為云原生環境設計。它支持自動服務發現、動態配置更新以及多種后端(如 Docker、Kubernetes、Consul 等)。本教程將指導你如何在本地部署 Traefik,并配置其作為反向代理和負載均衡器。 1. 準備工作 在開始之前,請確保你的…

三維數據可視化與表面重建:Marching Cubes算法的原理與應用

1. 引言 隨著現代醫學影像技術的飛速發展&#xff0c;三維數據的可視化與重建已成為醫學研究、臨床診斷和手術規劃的重要工具。在眾多三維重建算法中&#xff0c;Marching Cubes算法因其高效、穩定的特性成為從離散數據場中提取等值面的經典方法。本報告將深入探討Marching Cu…

MySql面試總結(二)

WHERE 子句優化 截至2024年7月,MySQL最新穩定版本是8.2,并不存在MySQL 8.4 。下面從常見的幾個方面為你介紹 MySQL 8.x 中 WHERE 子句的優化方法: 1. 確保使用索引 原理:索引可以加快數據的查找速度,當 WHERE 子句中的條件列有索引時,MySQL 可以直接定位到符合條件的數…

【圖論】判斷圖中有環的兩種方法及實現

判斷圖中有環的兩種方法及實現 在圖論中&#xff0c;檢測有向圖是否存在環是常見問題。本文將介紹兩種主流方法&#xff1a;DFS三色標記法和拓撲排序&#xff08;Kahn算法&#xff09;&#xff0c;并提供對應的C代碼實現。 方法一&#xff1a;DFS三色標記法 核心思想 通過深…

11.【線性代數】——矩陣空間,秩1矩陣,小世界圖

十一 矩陣空間&#xff0c;秩1矩陣&#xff0c;小世界圖 1. 矩陣空間交集 和 和集 2. 所有解空間3. r 1 r1 r1的矩陣4. 題目5. 小世界圖 空間&#xff1a;組成空間的元素的線性組合都在這個空間中。 1. 矩陣空間 舉例&#xff1a;矩陣空間&#xff08; M M M 所有3x3的矩陣&…

【網絡安全 | 滲透測試】GraphQL精講一:基礎知識

未經許可,不得轉載, 文章目錄 GraphQL 定義GraphQL 工作原理GraphQL 模式GraphQL 查詢GraphQL 變更(Mutations)查詢(Queries)和變更(Mutations)的組成部分字段(Fields)參數(Arguments)變量別名(Aliases)片段(Fragments)訂閱(Subscriptions)自省(Introspecti…

關于虛擬環境中遇到的bug

conda和cmd介紹 介紹 Conda 概述&#xff1a; Conda是一個開源包管理系統和環境管理系統&#xff0c;尤其適用于Python和R語言的開發環境。它允許用戶創建獨立的虛擬環境&#xff0c;方便地管理依賴包和軟件版本。 特點&#xff1a; 環境管理&#xff1a;可以創建、導入、導…