談「堆疊」與「佇列」的認識

2021-10-06 15:00:19 字數 1818 閱讀 9269

談「堆疊」與「佇列」的認識

開發工具與關鍵技術:visual studio 2015 談「棧」的認識

剛剛接觸這個「堆疊」,簡稱——棧。它呢是我在這個《資料結構與演算法》中第一次看到的乙個陌生的詞,也是我學程式設計的這一段時間以來的第一次接觸;對於初學者的我們來說就會疑問了,什麼是「棧」?在電視上我們看得那些古裝劇裡面就有這個客棧,而我們說的並不是這個;它們的意義上可以說是乙個意思,我就是這樣理解這個棧的,而且它這個棧呢有進棧有出棧等等。

下面我們來看一下棧的定義:堆疊簡稱為棧,是限定只能在表的一端進行插入和刪除操作的線性表。在表中,允許插入和刪除的一端稱作「棧頂」而另一端呢稱作「棧底」。通常將元素插入棧頂的操作稱作為「入棧」(進棧或壓棧),稱刪除棧頂元素的操作為「出棧」。如下圖所示:(圖來自唐懿芳老師)

在我們刪除的時候呢為了避免刪除了找不到,所以我們就需要乙個備份

public object delete(int i)throws exception

接著上面的就是棧的儲存結構了,它分為倆種儲存結構:

(1)順序棧——採用順序結構儲存

(2)鏈棧——採用鏈式結構儲存

#define maxsize 堆疊可能達到的最大長度

typedef structseqstack

//入棧

public void push(object obj)throws exception

top++;

stack[top]=obj;

}//出棧

public object pop()throws exception

object obj=stack[top]

top--;

return obj;

}

如下圖所示出棧和入棧的情況,出棧就乙個放入備用空間,防止找不到,入棧就增加乙個空間,例如:就好像我們家裡碗櫃的擺放都是疊著的,我們拿的時候呢就只能從上面開始拿,不能從下面開始拿這是肯定的,如果我們從下開始那麼那些上面的盤子就會掉,都是同樣的道理(下圖來自唐懿芳老師)

與此相反,我們的佇列也是「先進先出」的原理。佇列簡稱為隊,是限定只能在表的一端作插入運算、在另一端作刪除運算的線性表;在表中,允許插入的一端稱作「隊尾」,允許刪除的另一端稱作「隊首」(或「隊頭」);它呢通常會將元素插入隊尾的操作稱作為入佇列(或入隊),稱作除隊。

這個堆疊跟「佇列」是相反的,它特點是「後進先出」。它後面來,反而它能最先走,所以我們說它是不講道理的堆疊。接著上面的佇列,那麼當rear=maxsize-1時,隊列為滿,如果再加入新元素,就會產生「溢位」。但是這種「溢位」並不是真正的溢位,在陣列的前端還有可能有空的位置,所以我們說這是一種假溢位。如下圖所示:它的各種佇列的情況(圖來自唐懿芳老師)

針對上面的假溢位的解決辦法就是:迴圈佇列。那麼它的刪除隊首元素是這樣的,請看下面的**

deletequeue(q)刪除隊首元素

elementtype deletequeue(cirqueue*q)

else

}

佇列的儲存結構

兩種結構:(1)順序佇列——採用順序結構儲存

(2)鏈結佇列——採用鏈式結構儲存

佇列的順序儲存結構,當front和rear相等時,隊列為空。

隊滿:rear==maxsize-1

堆疊與佇列

堆疊與佇列可以用陣列實現,也可以用鍊錶實現。下文統一用鍊錶實現上述資料結構。堆疊服從先進後出原則,只對棧頭進行刪除和插入操作,即封鎖了鍊錶的一端,只對鍊錶的另一端進行操作,就形成了邏輯上的堆疊結構。節點 public class stacknode 堆疊實現 public class stackli...

佇列與堆疊

兩個線性資料結構 堆疊 stack 和佇列 queue 堆疊中元素具有後進先出lifo last in fisrt out 而佇列中的元素確實先進先出fifo fisrt in last out define maxsize 50 define false 0 define true 1 typed...

堆疊與佇列模擬

兩個題目 1 用兩個堆疊模擬乙個佇列 2 用兩個佇列模擬乙個堆疊 先看第乙個問題 用兩個堆疊模擬乙個佇列 只需要明白堆疊和佇列的特點,乙個是先進後出,乙個是先進先出就好做事了。乙個堆疊是先進先出,再把這個堆疊的資料存放到第二個堆疊不就ok了,變成了先進先出了麼?所以解決方法1就是兩個棧 stack1...