js資料結構和演算法(二)棧和佇列

2021-06-28 01:05:32 字數 1807 閱讀 2824

棧和佇列都是動態的集合,在棧中,可以去掉的元素是最近插入的哪乙個。棧實現了後進先出。在佇列中,可以去掉的元素總是在集合中存在的時間最長的那乙個。佇列實現了先進先出的策略。

棧的官方定義:棧(stack)是乙個後進先出(last in first out,lifo)的線性表,它要求只在表尾進行刪除和插入操作。對於棧來說,這個表尾稱為棧的棧頂,相應的表頭稱為棧底。入棧使用push()方法。出棧使用pop()方法。

最開始棧中不含有任何資料,叫做空棧,此時棧頂就是棧底。然後資料從棧頂進入,棧頂棧底分離,整個棧的當前容量變大。資料出棧時從棧頂彈出,棧頂下移,整個棧的當前容量變小。

我們把作用於佇列上的insert操作稱為入隊(enqueue),把作用於佇列上的delete操作稱為出隊(dequeue)。我們使用變數top來記錄棧頂元素的位置和標記**可以加入新的元素,當向棧內壓入元素時,該變數增大;從棧內彈出元素時,該變數減小。

棧的插入和刪除操作都是在一端進行的,而佇列的操作卻是在兩端進行的。

typedef struct

sqstack;

這裡定義了乙個順序儲存的棧,它包含了三個元素:base,top,stacksize。

其中base是指向棧底的指標變數,top是指向棧頂的指標變數,stacksize指示棧的當前可使用的最大容量。

#define stack_init_size 100

initstack(sqstack *s)

入棧操作又叫壓棧操作,就是向棧中存放資料。

入棧操作要在棧頂進行,每次向棧中壓入乙個資料,top指標就要+1,知道棧滿為止。

出棧操作就是在棧頂取出資料,棧頂指標隨之下移的操作。

每當從棧內彈出乙個資料,棧的當前容量就-1。

入佇列操作其實就是在隊尾追加乙個元素,不需要任何移動,時間複雜度為o(1)。

出佇列則不同,因為我們已經架設下標為0的位置是佇列的隊頭,因此每次出佇列操作所有元素都要向前移動。

push():入棧操作

pop():出棧操作(返回棧頂元素並刪除t)

peak():返回棧頂元素而不刪除它

clear():清除棧內所有元素

length():記錄棧內元素的個數

empty屬性:表示棧內是否含有元素

function stack()
用乙個陣列datastore來儲存棧內元素,變數top記錄棧頂位置

先來實現push()方法,當向棧中壓入乙個新元素時,需要將其儲存在陣列中變數top對應的位置,然後將top值加1:

function push(element)
function pop()
peek方法返回陣列的第乙個top-1位置的元素,即棧頂元素:

function peek()
length方法通過返回變數top值的方法返回棧內的元素的個數:

function length()
將變數top的值設為0,就可以清空乙個棧了:

function clear()

資料結構和演算法之二 棧和佇列

上一文中,我們學習了陣列和鍊錶,它們兩個是儲存資料的最底層結構,是功能完全的線性表。棧和佇列是受限的線性表,啥叫功能完全,功能受限呢?陣列和鍊錶,我們可以對裡面任意位置上的元素進行任意的操作,不受任何限制,而棧和佇列,其內部也是陣列或鍊錶實現,但是對外暴露的操作介面是有限的,棧只能在棧頂進行壓棧和出...

JS資料結構和演算法 棧

棧是一種後進先出的資料結構 其限制是僅允許在一端進行插入和刪除。這一端被稱為棧頂,另一端稱為棧底 lfo last in first out 後進入的元素第乙個彈出棧空間 向 個棧插入新元素又稱作進棧 入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素 從 個棧刪除元素又稱作岀棧,它是...

資料結構與演算法 棧和佇列

棧 是限制在表的一端進行插入和刪除運算的線性表。棧又稱後進先出簡稱lifo表 佇列 也是一種運算受限的線性表。它只允許在標的一端進行插入,而在另一端進行刪除。佇列亦稱先進先出fifo表 1.棧與佇列的區別 1 佇列先進先出,棧先進後出。2 對插入和刪除操作的 限定 棧是限定只能在表的一端進行插入和刪...