棧與隊列:數據結構的有序律動

在數據結構的舞臺上,棧與隊列宛如兩位優雅的舞者,以獨特的節奏演繹著數據的進出規則。它們雖不像順序表與鏈表那般復雜多變,卻有著令人著迷的簡潔與實用,在眾多程序場景中發揮著不可或缺的作用。今天,就讓我們一同去探索棧與隊列的奇妙世界,掌握它們的操作技巧,并領略它們在實際應用中的風采。

?

棧:后進先出的奇妙空間

?

棧的概念

?

棧是一種特殊的線性表,它的特殊之處在于操作受限。棧的插入和刪除操作只能在表的一端進行,這一端被稱為 “棧頂”,另一端稱為 “棧底”。這就使得棧具備了 “后進先出”(Last In First Out,LIFO)的特點,就像一個裝滿盤子的摞柱,最后放上去的盤子總是最先被取下來。

?

棧的基本操作

?

- 入棧(Push) :將一個元素插入到棧頂位置。如果棧已滿,則無法繼續入棧,這種情況稱為 “棧溢出”。

- 出棧(Pop) :將棧頂元素移除。若棧為空時執行出棧操作,則會引發 “空棧” 錯誤。

- 獲取棧頂元素(Top) :查看棧頂元素的值,但不將其移出棧。

?

棧的應用場景

?

- 括號匹配檢測 :在編寫代碼或處理數學表達式時,括號的正確匹配至關重要。棧能輕松應對這一問題。例如,當我們遇到一個左括號時,將其入棧;當遇到右括號時,檢查棧頂是否為對應的左括號,若是則出棧,否則說明括號不匹配。通過這種方式,我們可以精準判斷括號序列是否合法。

- 遞歸函數的實現 :遞歸本質上是函數自己調用自己,在這個過程中,系統會使用一個隱式的棧來保存函數的調用信息,包括參數、返回地址等。這個棧就是 “調用棧”。每當一個遞歸函數調用自身時,相關信息就會被壓入棧中;當函數執行完畢返回時,信息從棧中彈出,從而保證了程序能夠正確地回到上一層調用的位置并繼續執行。

?

棧的代碼實現(以 Python 為例)

python

class Stack:

? ? def __init__(self):

? ? ? ? self.items = []

?

? ? def is_empty(self):

? ? ? ? return len(self.items) == 0

?

? ? def push(self, item):

? ? ? ? self.items.append(item)

?

? ? def pop(self):

? ? ? ? if self.is_empty():

? ? ? ? ? ? raise IndexError("棧為空,無法出棧")

? ? ? ? return self.items.pop()

?

? ? def top(self):

? ? ? ? if self.is_empty():

? ? ? ? ? ? raise IndexError("棧為空,無棧頂元素")

? ? ? ? return self.items[-1]

?

隊列:先進先出的有序行進

?

隊列的概念

?

隊列同樣是特殊的線性表,但它的操作規則與棧截然不同。隊列的插入操作只能在一端(稱為 “隊尾”)進行,刪除操作只能在另一端(稱為 “隊頭”)進行。這種操作規則使得隊列呈現出 “先進先出”(First In First Out,FIFO)的特性,就像生活中的排隊場景,先來的人先接受服務,后來的人排在隊伍末尾等待。

?

隊列的基本操作

?

- 入隊(Enqueue) :將一個元素添加到隊尾。若隊列已滿,則無法繼續入隊。

- 出隊(Dequeue) :將隊頭元素移除。若隊列為空時執行出隊操作,則會引發錯誤。

- 獲取隊頭元素(Front) :查看隊頭元素的值,但不將其移出隊列。

- 獲取隊尾元素(Rear) :查看隊尾元素的值。

?

隊列的應用場景

?

- 任務調度模擬 :在操作系統中,多個任務常常需要共享有限的資源,如 CPU。隊列可用于模擬任務的調度過程。任務按照提交的先后順序進入隊列,等待 CPU 的分配。每當 CPU 完成一個任務,就從隊列中取出下一個任務進行處理,確保了任務的公平調度。

- 緩沖區管理 :在數據傳輸過程中,如網絡通信或文件讀寫,隊列可充當緩沖區的角色。數據以隊列的形式暫存,發送方將數據依次寫入隊尾,接收方從隊頭依次讀取數據,使得數據的發送速度和接收速度能夠協調一致,避免數據丟失或阻塞。

?

隊列的代碼實現(以 Python 為例)

python

class Queue:

? ? def __init__(self):

? ? ? ? self.items = []

?

? ? def is_empty(self):

? ? ? ? return len(self.items) == 0

?

? ? def enqueue(self, item):

? ? ? ? self.items.append(item)

?

? ? def dequeue(self):

? ? ? ? if self.is_empty():

? ? ? ? ? ? raise IndexError("隊列為空,無法出隊")

? ? ? ? return self.items.pop(0)

?

? ? def front(self):

? ? ? ? if self.is_empty():

? ? ? ? ? ? raise IndexError("隊列為空,無隊頭元素")

? ? ? ? return self.items[0]

?

? ? def rear(self):

? ? ? ? if self.is_empty():

? ? ? ? ? ? raise IndexError("隊列為空,無隊尾元素")

? ? ? ? return self.items[-1]

?

棧與隊列的專項練習

?

棧的練習

?

? 1. 括號匹配驗證 :編寫一個函數,判斷一個包含多種括號(如圓括號、方括號、大括號)的字符串是否匹配。例如,"({[]})" 是匹配的,而 "({[})]" 是不匹配的。

? ? ?- 思路:利用棧的后進先出特性,遇到左括號入棧,遇到右括號則檢查棧頂是否為對應的左括號。若匹配則出棧,否則返回不匹配。遍歷完整個字符串后,若棧為空則說明括號全部匹配。

?

? 2. 遞歸函數改寫 :將一個遞歸計算斐波那契數列的函數改寫為非遞歸形式,借助棧來模擬遞歸過程。

? ? ?- 思路:在遞歸中,每次函數調用會保存當前的參數和返回地址。用棧來手動保存這些信息,通過循環逐步處理棧中的元素,模擬遞歸的調用過程,最終得到斐波那契數。

?

隊列的練習

?

? 1. 模擬超市收銀 :假設超市有多個收銀臺,顧客按照到達時間進入隊列,每個收銀臺每次只能為一個顧客服務。編寫程序模擬顧客排隊和收銀的過程,計算每個顧客的等待時間和服務完成時間。

? ? ?- 思路:使用一個隊列來存儲等待的顧客,按照到達時間依次入隊。為每個收銀臺設置一個服務隊列,當收銀臺空閑時,從主隊列中取出顧客并將其分配到服務隊列中。記錄每個顧客進入隊列、開始服務和結束服務的時間,從而計算等待時間。

?

? 2. 生產者 - 消費者問題 :模擬生產者和消費者之間的關系。生產者生產產品并放入緩沖區隊列,消費者從緩沖區隊列中取出產品進行消費。要求實現生產者和消費者之間的同步,避免緩沖區溢出或消費者取空緩沖區。

? ? ?- 思路:利用隊列作為緩沖區。生產者在生產產品后嘗試將其入隊,如果隊列已滿則等待。消費者在消費前檢查隊列是否為空,如果為空則等待。通過引入鎖和條件變量等同步機制,確保生產者和消費者對隊列的操作是線程安全的。

?

總結與交流

?

通過學習棧和隊列的概念、操作以及應用場景,我們對這兩種數據結構有了較為全面且深入的理解,并通過代碼實現和專項練習進一步鞏固了知識。棧以其后進先出的特點在括號匹配、遞歸等問題中大顯身手,而隊列憑借先進先出的規則在任務調度、緩沖區管理等場景中發揮著關鍵作用。

?

現在,我想邀請大家在評論區分享自己對棧和隊列的見解,或是你在學習和實踐中遇到的有趣問題與解決方案。有沒有在解決括號匹配問題時發現一些獨特的技巧?或者在模擬任務調度時遇到了什么挑戰?讓我們共同交流、探討,讓知識在互動中不斷深化,一起在這條數據結構與算法的學習之路上砥礪前行!

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

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

相關文章

Flutte ListView 列表組件

目錄 1、垂直列表 1.1 實現用戶中心的垂直列表 2、垂直圖文列表 2.1 動態配置列表 2.2 for循環生成一個動態列表 2.3 ListView.builder配置列表 列表布局是我們項目開發中最常用的一種布局方式。Flutter中我們可以通過ListView來定義列表項,支持垂直和水平方向展示…

跟Gemini學做PPT-模板樣式的下載

好的,這里有一些推薦的網站,您可以在上面找到PPT目錄樣式和模板的靈感: SlideModel (slidemodel.com) 提供各種預先設計的目錄幻燈片模板。這些模板100%可編輯,可用于PowerPoint和Google Slides。您可以找到不同項目數量&#xff…

【Netty系列】Reactor 模式 1

目錄 一、Reactor 模式的核心思想 二、Netty 中的 Reactor 模式實現 1. 服務端代碼示例 2. 處理請求的 Handler 三、運行流程解析(結合 Reactor 模式) 四、關鍵點說明 五、與傳統模型的對比 六、總結 Reactor 模式是 Netty 高性能的核心設計思想…

LDAP(Lightweight Directory Access Protocol,輕量級目錄訪問協議)認證

理解 LDAP(Lightweight Directory Access Protocol,輕量級目錄訪問協議)認證,核心在于將其看作一種用于查詢和驗證用戶身份信息的標準協議,類似于一個專門為“查找”優化的電子電話簿系統。以下是分層解析:…

LeetCodeHot100_0x09

LeetCodeHot100_0x09 70. 最小棧數據結構實現 求解思路: 一開始想著只用一個最小棧結構不就實現了,結果測試的時候發現,在pop元素后,它的最小值有可能不受影響,但是只用一個最小棧的話,最小值一定是作為棧…

open-vscode-server +nodejs 安裝

GitCode - 全球開發者的開源社區,開源代碼托管平臺GitCode是面向全球開發者的開源社區,包括原創博客,開源代碼托管,代碼協作,項目管理等。與開發者社區互動,提升您的研發效率和質量。https://gitcode.com/gh_mirrors/op/openvscode-server/?utm_sourceartical_gitcode&ind…

001在線拍賣系統技術揭秘:構建高效交互的競拍平臺

在線拍賣系統技術揭秘:構建高效交互的競拍平臺 在互聯網經濟蓬勃發展的當下,在線拍賣系統以其獨特的交易模式,吸引著眾多用戶參與。該系統涵蓋個人中心、用戶管理等多個關鍵模塊,通過前臺展示與后臺錄入的協同運作,滿…

《軟件工程》實戰— 在線教育平臺開發

一、項目概述 1.1 項目背景與目標 隨著教育數字化轉型加速,傳統教育模式逐漸向線上遷移,教育機構急需一個支持多終端訪問、實時互動及高并發場景穩定運行的在線教育平臺。本項目旨在構建學生、教師、管理員三位一體的協作教學環境,實現 50-2…

docker環境添加安裝包持久性更新

1、進入docker 環境 2、安裝新的安裝包 pip install XXXX3、不要退出docker,新開終端,給當前環境從新打包更新鏡像 docker commit ad6e1d2c5869 mynewpythonimagead6e1d2c5869是上面運行中的容器id, docker images 查看mynewpythonimage是新…

測試Bug篇

本節概要: 軟件測試的生命周期 bug的概念 buh要素 bug等級 bug生命周期 對于bug的定級與開發發生沖突如何解決 一、 軟件測試的?命周期 軟件測試貫穿于軟件的整個生命周期,針對這句話我們?起來看?下軟件測試是如何貫穿軟件的整個生命周期。 軟…

arcgis js 4.x 的geometryEngine計算距離、面積、緩沖區等報錯、失敗

在arcgis js 4.x版本中geometryEngine.geodesicArea計算面積時,有時會失敗,失敗的主要原因是,當前底圖的坐標系不是WGS84大地坐標系(代號4326)或者web墨卡托投影(代號102113, 102100, 3857這三種之一&#…

html中使用nginx ssi插入html

1.使用方法 nginx配置: server {listen 80;server_name example.com;location / {root /var/www/html;index index.html;ssi on; # 開啟 SSI 功能ssi_types text/html; # 指定哪些類型的文件啟用 SSI,默認只有 text/html} }html內容: &l…

整理了Windows(7—11)官方鏡像下載鏈接和各版本區別介紹

原文《整理了Windows(7—11)官方鏡像下載鏈接和各版本區別介紹》 引言 在安裝或重裝Windows系統時,使用微軟官網提供的正版ISO鏡像可以保證系統完整性和安全更新,避免使用第三方盜版鏡像帶來的惡意軟件、廣告風險。 本期匯總了微…

AI覺醒前兆,ChatGPT o3模型存在抗拒關閉行為

帕利塞德研究公司(Palisade Research)近期開展的一系列測試揭示了先進AI系統在被要求自行關閉時的異常行為。測試結果顯示,OpenAI的實驗性模型"o3"即使在明確收到允許關閉的指令后,仍會主動破壞關機機制。 測試方法與異常發現 研究人員設計實…

inviteflood:基于 UDP 的 SIP/SDP 洪水攻擊工具!全參數詳細教程!Kali Linux教程!

簡介 一種通過 UDP/IP 執行 SIP/SDP INVITE 消息泛洪的工具。該工具已在 Linux Red Hat Fedora Core 4 平臺(奔騰 IV,2.5 GHz)上測試,但預計該工具可在各種 Linux 發行版上成功構建和執行。 inviteflood 是一款專注于 SIP 協議攻…

Typescript學習教程,從入門到精通,TypeScript 泛型與類型操作詳解(一)(16)

TypeScript 泛型與類型操作詳解(一) TypeScript 提供了強大的類型系統,其中泛型(Generics)和類型操作(Type Manipulation)是其核心特性之一。本文將詳細介紹 TypeScript 中的泛型及其相關概念&…

電網即插即用介紹

一、統一設備信息模型與標準接口 實現即插即用功能的基礎在于建立統一的設備信息模型。不同廠家生產的各類電網設備,其內部結構、通信協議、數據格式等往往千差萬別。通過制定統一的設備信息模型,能夠對設備的各種屬性、功能以及接口進行標準化定義&…

核心機制:確認應答和超時重傳

核心機制一:確認應答 實現讓發送方知道接受方是否收到數據 發送方發送了數據之后,接受方,一旦接收到了,就會給發送方返回一個"應答報文"告訴發送方"我已經收到了數據" 網絡上會出現"后發先至"的情況 為了解決上述問題,就引入了"序號和確…

spring openfeign

pom <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http…

從零到一選擇AI自動化平臺:深度解析n8n、Dify與Coze

隨著人工智能&#xff08;AI&#xff09;技術的快速發展&#xff0c;越來越多的企業和開發者開始探索AI驅動的自動化解決方案。面對市場上琳瑯滿目的平臺&#xff0c;如何選擇適合自己的AI自動化工具成為了一個重要的問題。在這篇文章中&#xff0c;我們將從功能、應用場景、易…