棧和佇列 都是動態集合,且在其上進行delete操作所移除的元素都是預先設定的。在棧(stack)中,被刪除的都是最近插入的元素:棧實現的是一種後進先出的策略。類似的,在佇列中,被刪除的總是在集合中存在時間最長的那個元素:佇列實現的是一種先進先出的策略。在計算機上實現棧和佇列有好幾種有效方式。本文將介紹利用乙個簡單的陣列實現這兩種結構。
棧
棧上的insert操作稱為壓入(push),而無引數的delete操作成為彈出(pop)。這兩個名字使人聯想到現實中的棧,餐館中裝有盤子的棧。盤子從棧中彈出的次序剛好同他們壓入測次序相反,以為只有最上面的盤子才可以被取下來哦。
我們可以用陣列來實現乙個可容納n個元素的棧。該陣列有乙個屬性s.top,指向最新插入的元素。棧中包含的元素為s[1…s.top],其中s[1]是棧底元素,而s[s.top]是棧頂元素。
棧有4個元素,棧頂元素為9。呼叫push(s,17)和push(s,3)後棧頂元素變為3。
呼叫pop(s)並返回最後壓入的元素3,雖然此時3仍然在陣列中,但是棧頂元素已經變為17了。
當s.top=0的時候,棧中不包含任何元素,即棧是空(empty)的。要測試乙個棧是否為空可以用查詢操作stack-empty。如果試圖對乙個空棧執行彈出操作,則稱棧下溢(underflow),這通常是乙個錯誤。如果s.top超過了n則稱棧上溢(overflow)。
棧的幾種操作只許用幾行**來實現
stack-empty (s)
if s.top ==
0return
true
else
return false
push(s,x)
s.top == s.top +
1s[s.top]
= x
pop(s)
if stack-
empty
(s) error"underflow"
else s.top = s.top -
1return s[s.top +
1]
佇列佇列上的insert操作成為入隊(enqueue),delete操作稱為出隊(dequeue);正如棧的pop操作一樣,dequeue操作也沒有元素引數。佇列的先進先出特性類似於收銀台等待結賬的一堆顧客。佇列有對頭(head)和隊尾(tail),當有乙個元素入隊它被放在隊尾的位置,就像乙個新到來的顧客排在隊伍末端一樣。而出隊的元素則總是在隊頭的那個。
棧和佇列的表示及實現
鏈棧的表示 佇列的基本表示及操作 鏈佇列一般線性表 棧邏輯結構 一對一 邏輯結構 一對一 儲存結構 順序表 鍊錶 儲存結構 順序表 鍊錶 運算規則 隨機訪問 運算規則 後進先出 lifo adt stack 資料關係 r1 約定an端為棧頂,a1端為棧底。基本操作 adt stack利用一組位址連續...
C 棧和佇列 ADT 棧的表示和實現
棧底指標是不動的,插入,刪除都是對棧頂指標進行移動 基本操作的實現 棧的構造,判空,插入,刪除,清空,銷毀,列印 棧的定義 typedef structsqstack 棧的基本操作 操作構造乙個空棧s。initstack s 初始條件 棧s已存在。操作結果 棧s被銷毀。destroystack s ...
陣列和棧,佇列
push 用於在array結尾新增乙個或多個項,pop 方法用於刪除最後乙個陣列項 length 1 返回它作為函式值 shift 將刪除陣列中的第乙個項,將其作為函式值返回 另乙個方法是unshift 方法,它把乙個項放在陣列的第乙個位置,然後把餘下的項向下移動乙個位置 var a a b c d...