山東中醫藥大學資料結構第三章棧與佇列

2021-06-27 11:30:35 字數 3625 閱讀 1662

3.1 棧

3.1.1棧的邏輯結構

1.棧的定義

棧是限定僅在表尾進行插入和刪除操作的線性表,允許插入和刪除的一端稱為棧頂,另一端稱為棧底,不含任何元素的棧稱為空棧。

注意:棧只是對錶插入和刪除操作的位置進行了限制,並沒有限定插入和刪除操作進行的時間。

2.棧的抽象資料型別定義

adt stack

data

棧中元素具有相同型別及後進先出特性,

相鄰元素具有前驅和後繼關係

operation

initstack

前置條件:棧不存在

輸入:無

功能:棧的初始化

輸出:無

後置條件:構造乙個空棧

destroystack

前置條件:棧已存在

輸入:無

功能:銷毀棧

輸出:無

後置條件:釋放棧所占用的儲存空間

push

前置條件:棧已存在

輸入:元素值x

功能:在棧頂插入乙個元素x

輸出:如果插入不成功,丟擲異常

後置條件:如果插入成功,棧頂增加了乙個元素

pop

前置條件:棧已存在

輸入:無

功能:刪除棧頂元素

輸出:如果刪除成功,返回被刪元素值,否則,丟擲異常

後置條件:如果刪除成功,棧減少了乙個元素

gettop

前置條件:棧已存在

輸入:無

功能:讀取當前的棧頂元素

輸出:若棧不空,返回當前的棧頂元素值

後置條件:棧不變

gettop

前置條件:棧已存在

輸入:無

功能:讀取當前的棧頂元素

輸出:若棧不空,返回當前的棧頂元素值

後置條件:棧不變

empty

前置條件:棧已存在

輸入:無

功能:判斷棧是否為空

輸出:如果棧為空,返回1,否則,返回0

後置條件:棧不變

endadt

3.1.2棧的順序結構及實現

1.棧的順序儲存結構————順序棧

棧的順序儲存結構稱為順序棧。

2.順序棧的實現

const  int  stacksize=100;

template 

class  seqstack

bool  empty ( )

private:

datatype  data[stacksize];

int  top;

}(1)順序棧入棧演算法 push

template

void  seqstack::push ( datatype  x)

(2)順序棧的出棧演算法 pop

template 

datatype  seqstack:: pop ( )

3.1.3棧的鏈棧儲存結構及實現

1.棧的鏈結儲存結構———鏈棧

template

class linkstack

(1)鏈棧入棧演算法 push

template

void linkstack::push(datatype x)

(2)鏈棧出棧演算法 pop

template

datatype linkstack::pop( )

3.1.4順序棧和鏈棧的比較

時間效能:相同,都是常數時間o(1)。

空間效能:

順序棧:有元素個數的限制和空間浪費的問題。

鏈棧:沒有棧滿的問題,只有當記憶體沒有可用空間時才會出現棧滿,但是每個元素都需要乙個指標域,從而產生了結構性開銷。

總之,當棧的使用過程中元素個數變化較大時,用鏈棧是適宜的,反之,應該採用順序棧。

3.2  佇列

3.2.1佇列的邏輯結構

1.佇列的定義

佇列是只允許在一端進行插入操作,在另一端進行刪除操作的線性表。允許插入的一端稱為隊尾,允許刪除的一端稱為隊頭。特點:先進先出。

2.佇列的抽象資料型別定義

adt  queue

data

佇列中元素具有相同型別及先進先出特性,

相鄰元素具有前驅和後繼關係

operation

initqueue

前置條件:佇列不存在

輸入:無

功能:初始化佇列

輸出:無

後置條件:建立乙個空佇列

destroyqueue

前置條件:佇列已存在

輸入:無

功能:銷毀佇列

輸出:無

後置條件:釋放佇列所占用的儲存空間

enqueue

前置條件:佇列已存在

輸入:元素值x

功能:在隊尾插入乙個元素

輸出:如果插入不成功,丟擲異常

後置條件:如果插入成功,隊尾增加了乙個元素

dequeue

前置條件:佇列已存在

輸入:無

功能:刪除隊頭元素

輸出:如果刪除成功,返回被刪元素值

後置條件:如果刪除成功,隊頭減少了乙個元素

getqueue

前置條件:佇列已存在

輸入:無

功能:讀取隊頭元素

輸出:若佇列不空,返回隊頭元素

後置條件:佇列不變

empty

前置條件:佇列已存在

輸入:無

功能:判斷佇列是否為空

輸出:如果隊列為空,返回1,否則,返回0

後置條件:佇列不變

endadt

3.2.2佇列的順序儲存結構及實現

1.佇列的順序儲存結構——迴圈佇列

const int queuesize=100;

template

class cirqueue

(2|)迴圈佇列的出隊演算法 dequeue

template

datatype cirqueue::dequeue( )

(3)讀取隊頭元素

template

datatype cirqueue::getqueue( )

3.2.3佇列的鏈結儲存結構及實現

template

class linkqueue

;鏈佇列的建構函式 linkqueue

template

linkqueue::linkqueue( )

鏈佇列的入隊演算法 enqueue

template

void linkqueue::enqueue(datatype x)

鏈佇列的出隊演算法 dequeue

template

datatype linkqueue::dequeue( )

迴圈佇列和鏈佇列的比較

時間效能:

迴圈佇列和鏈佇列的基本操作都需要常數時間o (1)。

空間效能:

迴圈佇列:必須預先確定乙個固定的長度,所以有儲存元素個數的限制和空間浪費的問題。

鏈佇列:沒有佇列滿的問題,只有當記憶體沒有可用空間時才會出現佇列滿,但是每個元素都需要乙個指標域,從而產生了結構性開銷。



山東中醫藥大學資料結構第二章線性表

2.1 線性表的邏輯結構 2.1.1線性表的定義 線性表 linear list 簡稱表,是n n 0 個具有相同型別的資料元素的有限序列,線性表的資料元素的個數稱為線性表的長度。2.1.2線性表的抽象資料型別的定義 adt list data 線性表中的資料元素具有相同型別,相鄰元素具有前驅和後繼...

資料結構之第三章 棧

出棧特點 後進先出 最近忙著準備期末的考試,要知道大學生掛科是一件很可怕的事情。先將一點棧的知識記錄下來,一學期過了課本啥的也就丟了。棧是一種只能在一端進行刪除插入或刪除操作的線性表。棧中的資料元素的邏輯關係呈線性關係,所以棧可以和線性表一樣採用順序儲存結構進行儲存。採用順序儲存結構的棧稱為順序棧。...

資料結構導論 第三章棧)

棧和佇列可看作是特 殊的線性表,它們是 運算受限的線性表 定義 棧是只能在表的一端 表尾 進行 插入和刪除的線性表 特點 後進先出 棧中元素按a1,a2,a3,an的次序進棧,出棧的第乙個元素應 為棧頂元素。換句話說,棧的修改是按後進先出的原則進行的。因此,棧稱為後進先出線性表 lifo 棧的用途 ...