資料結構(c )(1) 棧

2021-07-29 21:19:32 字數 2053 閱讀 6059

最近在複習資料結構(我用的是資料結構與演算法分析c++描述 第三版的書,很不錯的書,有興趣的可以去看看)的相關知識,順便就做了些整理,以供參考。

棧(stack)是限制插入和刪除操作只能在乙個位置進行的表,該位置是表的末端,稱為棧的頂。對棧的操作是push(入棧)和pop(出棧),前者相當於插入,後者則是刪除最後插入的元素。最後插入的元素可以通過使用top方法在執行pop之前進行訪問。對空棧的pop或top操作,在棧adt中一般認為是乙個錯誤。另一方面,當執行push時超出棧空間的最大記憶體時候,這是棧在實現過程中所受的限制,並不是adt錯誤。

下面打個比方,以便於更好理解棧。其實對於棧,是一種後進先出的表,我們可以想象這樣一種現實中的場景,當汽車依次進入了乙個狹窄的巷子的時候,突然發現前面有個障礙物擋住了道路,那麼這個時候該怎麼辦?顯而易見,這個時候先進去的車輛是無法挪動的,只有在最後的車輛可以通過倒車而進行行駛,當最後一輛車出去後,相應的倒數第二輛車才可以出去,一直到最後第一輛車才有可能出了這個巷子,這也正是我們的棧的工作原理。

例如,將元素6、3、7、6、2依次插入到棧中的話,則棧的示意圖如下:

由於棧是是乙個表,因此任何實現表的方法都可以用來實現棧。其實棧就是對我們比較熟悉的表的操作進行了限制,對陣列來說,我們可以通過下標來訪問陣列中的任意乙個元素,而如果我們想陣列表現出棧的特性,那麼很容易做到的,只需要對陣列進行包裝,封裝成乙個類,該類只有顯著的push和pop操作,也就是對陣列的下標操作做一些限制,每次只能對陣列中的最後位置進行操作(這裡的最後位置指的是存放有元素的最大下標的位置)。在實際中,很明顯list和vector支援棧操作,99%的情況下,它們都是合理的選擇。當然對於棧的實現的選擇,需要具體情況具體分析,有時候為了特殊目的而設計的實現可以執行的更快。由於棧的所有操作都是常量時間的操作,所以,除非是在很特別的環境下,否則不太可能有明顯的改進。

當前兩個比較流行的棧的實現方式,乙個是使用鍊錶結構,另乙個則是使用陣列。

1、棧的鍊錶實現

棧的一種實現方法是使用單向鍊錶。我們通過在表頂端插入元素來實現push,通過刪除表頂端的元素實現pop。top操作知識訪問表頂端的元素並返回它的值。有時pop操作 和top操作可以合二為一。這裡面為什麼說要將元素放在表的頂端而不是末尾或其它位置呢?這個是因為在棧中我們只關心棧定的元素,那麼這個棧頂元素的訪問效率問題就必須要考慮了,所以將元素放在鍊錶的頂端,可以通過鍊錶的頭指標直接進行訪問,這個訪問時間是常量,而如果放在末尾,那麼則需要遍歷鍊錶找到棧頂的元素,顯然浪費了訪問的時間,這是不可取的。

2、棧的陣列實現

另一種可選的實現避免了使用鏈並且可能是更流行的解決方案。由於使用vector中的back、push_back、pop_back方法,實現棧特別容易。更一般的方法是使用陣列進行棧的構建,下面給出乙個基本的示例:

#includeusing namespace std;

#define maxsize 20

template class cstack

bool empty() const;

bool pop();

bool top(object &item) const;

bool push(const object &item);

private:

object m_thearray[maxsize];

int m_topofstack;

};template bool cstack::empty() const

template bool cstack::pop()

template bool cstack::top(object &item) const

template bool cstack::push(const object &item)

在棧中,這些操作都是以常數時間執行的,而且是以非常快的常數時間執行。在某些機器上,若在帶有自增和自減定址功能的暫存器上操作,則(整數)push和pop都可以寫成一條指令。最現代的計算機將棧操作作為其指令系統的一部分,這個事實強化了這樣一種思想,即在電腦科學中,棧很可能是繼陣列之後的最基本的資料結構。

資料結構 C 1 第 1 章 緒論

1.1.1 氣泡排序 時間複雜度,用大o記號 t n o n2 t n o n 2 t n o n2 void bubblesort1a n 1.1.2 演算法 演算法是指基於特定的計算模型,旨在解決某一資訊處理問題而設計的乙個指令序列。演算法應該具備 輸入與輸出,基本操作 確定性與可行性,難解性,...

課程作業 資料結構與演算法C (1)

課程作業6 歸併排序 氣泡排序 插入排序 選擇排序 歸併排序 氣泡排序 插入排序 選擇排序 主程式 include includeusing std vector using std cout using std endl using std swap include bubble sort.h i...

資料結構C(棧與佇列(1))

棧的理解就好比是堆盤子,想要拿最底下的盤子我們只能先拿走上面的盤子。所以棧遵循 後進先出 的原則。堆疊指的是具有一定約束的線性表 性質 插入和刪除都只能在表的一端進行 一端叫棧頂 top 另一端就叫棧底 操作 壓棧或入棧 push 出棧 pop 當然pop與push可以交叉進行 例 對於入棧 abc...