【數據結構】——棧

一、棧的概念和結構

棧其實就是一種特殊的順序表,其只允許在一端進出,就是棧的數據的插入和刪除只能在一端進行,進行數據的插入和刪除操作的一端稱為棧頂,另一端稱為棧底。棧中的元素遵循先進后出LIFO(Last InFirst Out)的原則。

?壓棧:棧的插入操作叫做進棧/壓棧/入棧,入棧的位置也是在棧頂。

?出棧:棧的刪除操作叫做出棧。出棧也是在棧頂。

那么我們的棧是要如何進行實現呢?

我們實現棧的話有兩種:鏈表和數組。

如果是使用鏈表的話,那么我們要是以頭為棧頂,那么我們進行頭插的話,就需要先考慮鏈表是否為空的情況,然后我們的頭插的結構也是比較麻煩,每次都需要進行節點的申請。

還有就是進行出棧的時候也比較麻煩。

如果我們使用數組,直接使用數組的尾部為棧頂,那么我們的壓棧和出棧都可以直接進行,時間復雜度為O(1)。

不過鏈表和數組都是可以實現的,不過如果使用鏈表進行實現的話,我們就推薦使用鏈表的頭為棧頂,然后數組的話我們建議使用數組的尾部為棧頂。這樣可以使得壓棧和出棧的時間復雜度都為O(1)。

二、棧的實現

1、棧的定義

我們上面提到了,我們實現棧,我們底層使用數組來實現,那么其定義和我們前面學習的順序表基本是一樣的,但是就是我們的棧是有一個限制的,就是其只能在一端進行出入。

棧的定義如下:

其實 arr就是我們存儲數據的數組,然后top表示當前我們的棧有多少個元素,capacity就表示我們當前的棧最大的容量。
我們定義好后,那么我們對這個棧進行一個初始化:

因為棧的銷毀這里也不做多的解釋了。

棧的銷毀:

下面我們實現棧的壓棧:

我們棧的特點就是其只有一端可以進行壓棧和出棧的操作,我們前面說到,我們使用數組來實現的話,那么我們是在數組的尾部進行壓棧和出棧,那么我們該如何進行壓棧呢?

我們在定義棧的時候,我們有一個成員top其是記錄當前我們的棧中的有效成員個數的,那么我們的數組是可以通過下標進行插入數據的,不過要注意的是,我們的棧如果此時為空,而且其表示棧的容量的成員也是空的時候,那么我們就需要進行空間申請的,還有就是棧如果滿了,那么我們此時也需要進行空間的申請。不過我們發現我們的棧為空和棧滿的時候有個共同點,就是我們的top和capacity是i相等的。所以我們再入棧操作的時候,一開始需要先進行判斷當前棧的空間是否足夠,不夠的話我們要進行擴容,然后我們擴容一般是二倍增容。還有一個特殊情況就是剛開始的時候,我們的容量還是0,那么我們此時進行二倍增容是行不通的,所以我們也特殊處理一下。

代碼如下:

?上面我們實現了壓棧,那么我們接下來就實現棧的另外一個功能:出棧

我們要出棧,那么我們的棧就要不為空才行,所以我們可以先寫一個函數判斷棧是否為空,然后通過這個函數我們就可以進行出棧,要注意的是我們的棧,出棧也是要在棧頂這一端,所以也是在數組的末尾端,那么我們的top進行--操作就可以了,那么就可以使得我們的棧的有效元素個數減-,而且是棧頂的第一個元素。

壓棧:

?我們棧有時候只是需要取棧頂的元素,并不需要出棧,那么我們也可以寫一個函數來實現,我們的取棧頂元素是很簡單的,就是訪問數組一樣,我們就訪問下標為top-1的元素即可。

然后我們也可以獲取當前棧的實際有效元素個數:

可以看到我們的棧的兩個大的功能還是很好實現的,和我們前面的順序表大致一樣,就是其要控制的是,其入棧和出棧的端要一致。

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

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

相關文章

大數據技術全景解析:Spark、Hadoop、Hive與SQL的協作與實戰

引言:當數據成為新時代的“石油” 在數字經濟時代,數據量以每年50%的速度爆發式增長。如何高效存儲、處理和分析PB級數據,成為企業競爭力的核心命題。本文將通過通俗類比場景化拆解,帶你深入理解四大關鍵技術:Hadoop、…

Android13 權限管理機制整理

一、概述 權限機制作為Android 系統安全的保證,很重要,這里整理一下 權限機制中framework 部分,selinux等其他的Android權限機制不在本次討論范圍內 二、個版本差異分類 Android13 Android12 Android11 及以下 拋開版本差異權限機制分為兩大類 一類是之前apk在Android6.0…

MySQL的Order by與Group by優化詳解!

目錄 前言核心思想:讓索引幫你“排好序”或“分好組”Part 1: ORDER BY 優化詳解1.1 什么是 Filesort?為什么它慢?1.2 如何避免 Filesort?—— 利用索引的有序性1.3 EXPLAIN 示例 (ORDER BY) Part 2: GROUP BY 優化詳解2.1 什么是…

awesome-digital-human本地部署及配置:打造高情緒價值互動指南

在數字化交互的浪潮中,awesome-digital-human-live2d項目為我們打開了本地數字人互動的大門。結合 dify 聊天 api,并借鑒 coze 夸夸機器人的設計思路,能為用戶帶來充滿情緒價值的交互體驗。本文將詳細介紹其本地部署步驟、dify 配置方法及情緒…

[ctfshow web入門] web68

信息收集 highlight_file被禁用了,使用cinclude("php://filter/convert.base64-encode/resourceindex.php");讀取index.php,使用cinclude("php://filter/convert.iconv.utf8.utf16/resourceindex.php");可能有些亂碼,不…

計算機網絡:深度解析基于鏈路狀態的內部網關協議IS-IS

IS-IS(Intermediate System to Intermediate System)路由協議詳解 IS-IS(Intermediate System to Intermediate System)是一種基于鏈路狀態的內部網關協議(IGP),最初由ISO為OSI(開放系統互連)模型設計,后經擴展支持IP路由。它廣泛應用于大型運營商網絡、數據中心及復…

SEGGER項目

SystemView 查看版本, 查看SEGGER官網,release時間是2019-12-18日, 而3.12.0的版本日期是2020-05-04 #define SEGGER_SYSVIEW_MAJOR 3 #define SEGGER_SYSVIEW_MINOR 10 #define SEGGER_SYSVIEW_REV 0SEGGER EMBEDDED Studio 根據S…

Linux——Mysql索引和事務

目錄 一,Mysql索引介紹 1,索引概述 1,索引的優點 2,索引的缺點 2,索引作用 3,索引分類 普通索引 唯一索引 主鍵索引 組合索引 全文索引 4,查看索引 5,刪除索引 6&…

【Web】LACTF 2025 wp

目錄 arclbroth lucky-flag whack-a-mole arclbroth 看到username為admin能拿到flag 但不能重復注冊存在的用戶 這題是secure-sqlite這個庫的問題,底層用的是C,沒處理好\0字符截斷的問題 (在 Node.js 中,由于其字符串表示方式…

訪問者模式(Visitor Pattern)詳解

文章目錄 1. 訪問者模式概述1.1 定義1.2 基本思想 2. 訪問者模式的結構3. 訪問者模式的UML類圖4. 訪問者模式的工作原理5. Java實現示例5.1 基本實現示例5.2 訪問者模式處理復雜對象層次結構5.3 訪問者模式在文件系統中的應用 6. 訪問者模式的優缺點6.1 優點6.2 缺點 7. 訪問者…

matlab介紹while函數

MATLAB 中的 while 語句介紹 在 MATLAB 中,while 語句是一種循環結構,用于在滿足特定條件時反復執行一段代碼塊。與 for 循環不同,while 循環的執行次數是動態的,取決于循環條件是否為真。 語法 while condition% 循環體代碼 e…

數字信號處理|| 快速傅里葉變換(FFT)

一、實驗目的 (1)加深對快速傅里葉變換(FFT)基本理論的理解。 (2)了解使用快速傅里葉變換(FFT)計算有限長序列和無限長序列信號頻譜的方法。 (3)掌握用MATLA…

.Net Mqtt協議-MQTTNet(一)簡介

一、MQTTNet 簡介 MQTTnet 是一個高性能的MQTT類庫,支持.NET Core和.NET Framework。 二、MQTTNet 原理 MQTTnet 是一個用于.NET的高性能MQTT類庫,實現了MQTT協議的各個層級,包括連接、會話、發布/訂閱、QoS(服務質量&#xff0…

時鐘晶振鎖相環pll方向技術要點和大廠題目解析

本專欄預計更新60期左右。當前第9期。 本專欄不僅適用于硬件的筆試面試,同樣也適用于梳理硬件核心的知識點。 通過本文能得到什么? 首先,根據實戰經驗總結時鐘晶振,鎖相環的主要知識點,技術要點,面試考點; 然后,列出時鐘晶振,鎖相環的筆試面試的主要題型真題和模擬題,…

機器學習 day6 -線性回歸練習

題目?: 從Kaggle的“House Prices - Advanced Regression Techniques”數據集使用Pandas讀取數據,并查看數據的基本信息。選擇一些你認為對房屋價格有重要影響的特征,并進行數據預處理(如缺失值處理、異常值處理等)。…

緩存(2):數據一致性

概述 一致性就是數據保持一致,在分布式系統中,可以理解為多個節點中數據的值是一致的。 強一致性:這種一致性級別是最符合用戶直覺的,它要求系統寫入什么,讀出來的也會是什么,用戶體驗好,但實現起來往往對系統的性能影響大弱一致性:這種一致性級別約束了系統在寫入成功…

CH579 CH573 CH582 CH592 藍牙主機(Central)實例應用講解

藍牙主機(Central),顧名思義,就是一個藍牙主設備,與從機(Peripheral)建立連接進行通信,可以接收從機通知,也可以給從機發送信息,通常Central和Peripheral結合…

不同類型的 SAP 項目

目錄 1 實施項目 2 SAP S/4 HANA 升級項目 3 數據遷移項目 4 優化項目 5 Rollout 項目 6 運維項目 1 實施項目 企業第一次用 SAP 系統,從硬件搭建到安裝 SAP、根據業務流程做配置、開發、培訓業務、測試系統直到系統上線。 SAP S/4 HANA ACTIVATE 實施方法論…

【uniapp】errMsg: “navigateTo:fail timeout“

項目場景: 在點擊編輯的時候不能跳轉的編輯的頁面,然后直接報錯errMsg: "navigateTo:fail timeout" 解決方案: 看看是否是出現了盒子的冒泡事件導致了兩次調用跳轉路徑 tap.stop

記錄學習的第三十五天

今天主攻單源最短路Dijkstra算法。不過,還是沒有完全掌握。 首先是書本的例題我理解了一遍。 然后其實在力扣上做了三道題的,但是我看題解的情況就不太會。然后試著用上面的方法敲了一下↓的題,但是不對啊,我也不知道為什么呀。