當然,除了上述原因之外,還有一個重要因素是為了搞定面試,

隨著軟體開發行業競爭的日益激烈,面試的難度也在逐漸增加,因為企業要從眾多的面試人中選出最優秀的人,只能提高面試的難度,而演算法和資料結構比較燒腦的硬核技能之一,自然也就成了面試的首選科目,并且隨著時間的推移,演算法和資料結構出現的頻率和占比也會不斷增加,因此為了順應時代發展的潮流,我們也要做一些調整,所以在后面的一些文章中,我會陸續更新一些關于演算法和資料結構的文章,希望大家能夠喜歡,
PS:當然隨著智能系統的普及,演算法和資料結構在企業中應用也越來越多,因此學習演算法和資料結構也是迫在眉睫的事了,
堆疊
堆疊(Stack)又叫堆疊(簡稱堆疊),它是在同一端進行插入和洗掉資料的線性表,
堆疊是最基礎也是最常見的資料結構之一,它的資料結構和操作流程如下圖所示:

其中,允許進行插入和洗掉的一端叫作堆疊頂(Top),另一端叫作堆疊底(Bottom),堆疊底固定,堆疊頂浮動,
當堆疊中的元素為零時,該堆疊叫作空堆疊,添加資料時一般叫作入堆疊或進堆疊(Push),洗掉資料叫作出堆疊或退堆疊(Pop),堆疊是后進先出(Last In First Out,LIFO)的線性表,

物理結構 & 邏輯結構
在手擼演算法之前,我們先來認識一下資料結構中的兩個重要概念:物理結構和邏輯結構,
當談到“物理”和“邏輯”一詞時,我們可以會想到資料庫中的邏輯洗掉和物理洗掉,
所謂的物理洗掉是指通過洗掉命令真實的將資料從物理結構中洗掉的程序;而邏輯洗掉是指通過修改命令將資料更改為“已洗掉”的狀態,并非真實的洗掉資料,
這里的邏輯結構和物理結構和上面的概念類似,所謂的物理結構是指可以將資料存盤在物理空間中,比如陣列和鏈表都屬于物理資料結構;而邏輯結構則是用于描述資料間的邏輯關系的,比如本文要講的堆疊就屬于邏輯結構,

可能有些人看到這里就蒙了,沒關系,我這里舉一個例子你就明白了,
如果用人來表示物理結構和邏輯結構的話,那么真實存在的有血有肉的人就屬于物理結構,而人的思想和信念就屬于邏輯結構了,

自定義堆疊I:陣列實作
通過上面的內容,我們知道了堆疊屬于邏輯結構,因此它的實作方式就可以有很多種了,比如陣列的實作方式或者是鏈表的實作方式,那么我們就先用陣列實作一下,堆疊的主要方法有:
① 定義結構
堆疊中資料會存盤在陣列中,top變數代表堆疊頂的指標,它其實存盤的是堆疊頂元素的下標,會隨著入堆疊不斷變化(后進先出),
② 入堆疊
每次當有資料插入時,只需在陣列中添加一個值,并將堆疊頂的下標 +1 即可,
入堆疊操作如下圖所示:

③ 出堆疊
此方法是洗掉堆疊中的資料的;
出堆疊只需洗掉陣列中堆疊頂資料(最后加入的資料),并修改堆疊頂下標 -1 即可,
出堆疊操作如下圖所示:

自定義堆疊II:鏈表實作
除了陣列之外,我們可以還可使用鏈表來實作堆疊結構,它的實作稍微復雜一些,我們先來看鏈表本身的資料結構:

使用鏈表實作堆疊的流程如下:

也就是說,入堆疊時我們將資料存盤在鏈表的頭部,出堆疊時我們從頭部進行移除,并將堆疊頂指標指向原頭部元素的下一個元素,
總結
本文我們使用了陣列和鏈表等物理結構來實作了堆疊,當然我們也可以使用其他容器來實作,我們只需要保證在操作堆疊時是后進先出的執行順序,并且至少包含 3 個重要方法:入堆疊、出堆疊和查詢堆疊頂元素就可以了,
最后
演算法和資料結構的學習是 3 分學 7 分練,只看不練是沒辦法學好演算法的,而且學習演算法和資料結構是一個循序漸進的程序,短時間內不會有明顯的收效,因為這些演算法經過了幾百年的發展和積累才得以流傳下來的,所以想要“玩得轉”還需要一點耐心,
————————————
看到這里你是不是對資料結構又有了一點新的認知呢~
如果你喜歡這篇文章的話,動動小指,點個贊再走~
如果你想學編程,小編推薦一個C語言/C++編程學習基地【點擊進入】!

一個活躍、高逼格、高層次的編程學習殿堂;編程入門只是順帶,思維的提高才有價值!
涉及:編程入門、游戲編程、網路編程、Windows編程、Linux編程、Qt界面開發、黑客等等....
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/161537.html
標籤:其他
