堆疊和佇列

2021-06-22 06:09:20 字數 1958 閱讀 2900

堆疊是限定插入和刪除操作都在表的同一端進行的線性表。允許插入和刪除元素的一端稱為棧頂,另一端稱為棧底。若棧中無元素,則稱為空棧。一定要記住的是:棧有後進先出的特點,lase in first out,lifo。

棧的基本操作除了插入和刪除外,還有建立和撤銷棧等操作。

creat():建立乙個空棧;

destroy():撤銷乙個棧;

isempty():若棧為空,則返回true,否則返回false;

isfull():若棧滿,則返回true,否則返回false;

top(x):在x中返回棧頂的元素,若操作成功,則返回true;否則返回false『

push(x):在棧頂插入元素x,即入棧。若操作成功,則返回true;否則返回false;

pop():從棧中刪除棧頂元素,即出棧,若操作成功,則返回true。否則返回false;

clear():清除堆疊中全部元素。

當然,堆疊也是有順序表示和鏈結表示兩種表示方式。順序棧使用了一維陣列的方式來實現,而順序棧使用的鍊錶的方式來實現。兩個表示方式的優缺點可以參考一維陣列和單鏈表的優缺點分析。

佇列是限定在表的一端插入,在表的另一端刪除的線性表。允許插入元素的一端稱為隊尾,允許刪除元素的另一端稱為隊頭。若佇列中沒有元素,則稱為空佇列。對於佇列而言,出隊的順序與入隊相同,所以它是先進先出的線性表,first in first out。

佇列的基本操作除了入隊和出隊之外,還有建立和撤銷佇列等操作。

creat():建立乙個空佇列;

destroy():撤銷乙個佇列;

isempty():若隊列為空,則返回true,否則返回false;

isfull():若佇列滿,則返回true,否則返回false;

front(x):在x中返回隊頭元素,操作成功返回true,否則返回false;

enqueue(x):在隊尾插入元素x,操作成功返回true,否則返回false;

dequeue():從佇列中刪除隊頭元素,操作成功返回true,否則返回false;

clear():清除堆疊中全部元素。

由於佇列是先進先出的特點,所以在佇列的順序表示中會出現乙個問題:「假溢位」。下面我們詳細解釋乙個該現象,而且給出解決方法。

我們使用front和rear分別指向佇列的頭元素和尾元素,我們首先建立乙個空佇列。然後讓20、30、40、50依次入隊,就是下圖b;然後20、30、40依次出隊,如下圖c。這個過程我們需要注意觀察佇列先進先出的特點。在元素入隊時,先將隊尾指標加1,然後元素入隊;元素出隊時,先將隊頭指標加1.然後元素出隊。這時,我們把60入隊,如果我們還想再讓後面的70等等元素入隊,就會出現溢位的現象。但是我們仔細觀察又發現,該佇列中隊頭位置還處在3個位置的空缺,那麼這種隊頭位置有空缺,隊尾反而出現溢位的現象就稱為「假溢位」!

一種改進方法是採用迴圈佇列結構,即把陣列從邏輯上堪稱是乙個頭尾相連的環,再有新元素需要入隊時,就可以將新元素存入下標0的位置。為了使入隊和出隊實現迴圈,可以利用取餘運算子%:

隊頭指標進1: front=( front+1)%maxsize;

隊尾指標進1:rear=(rear+1)%maxsize;

在迴圈佇列結構下,當front==rear時空佇列,當(rear+1)%maxsize==front時為滿佇列。注意滿佇列時實際仍有乙個元素的空間未使用。若不留這個元素的空間,則隊尾指標rear一定指向該元素空間,使得滿佇列時的判斷條件也是(front==rear),則與空佇列的判斷條件相同而導致無法區分。

計算字尾表示式的值。儘管中綴表示式是普遍使用的書寫形式,但在編譯程式中常用表示式的字尾形式求值,原因是字尾表示式中無括號,計算時無需考慮操作符的優先順序,因而計算簡單。把運算元之後的表示式稱為字尾表示式,又稱為逆波蘭表示式。

堆疊和佇列

堆疊是一種後進先出 lifo 的資料結構,在下推堆疊中,只允許兩種操作 將物件推入堆疊,並將物件從堆疊中彈出。元素只能在堆疊頂部新增和刪除。push將物件新增到堆疊頂部,pop從頂部刪除物件。乙個很好理解的例子,有一沓書,你可以只拿走 刪除 頂部的書,也可以在頂部新增新書。判斷其中的 是否成對出現 ...

堆 堆疊和佇列

堆和堆疊的區別 1 堆疊的大小是固定的,編譯器需要知道存放到堆疊的資料的大小,靈活性較差。引用存放在堆疊中。堆可以動態分別空間,大小沒有限制比較靈活。通過new建立的物件存放在堆中。2 堆疊只有乙個出入口,是先進後出的資料結構。先分配的記憶體後釋放。堆中的資料是無序的,建立和釋放內容都沒有固定的順序...

用堆疊模擬佇列,和用佇列模擬堆疊

最近在看 演算法導論 第十章裡面有一題是用了 兩個堆疊模擬乙個佇列,我設計的演算法如下 堆疊a和b,a用作入隊,b出隊 1 判隊滿 如果a滿且b不為空,則隊滿 2 判隊空 如果a和b都為空,則隊空 3 入隊 首先判隊滿。若隊不滿 1 棧a若不滿,則直接壓入棧a 2 若a滿,則將a中的所有元素彈出到棧...