第三章 棧和佇列

2021-08-29 05:28:20 字數 4605 閱讀 4238

特殊線性表——棧

1.棧的邏輯結構

空棧:不含任何資料元素的棧。

棧:限定僅在表尾進行插入和刪除操作的線性表。

棧的操作特性:後進先出(lifo)

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

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

adtstackdata

棧中元素具有相同型別及後進先出特性,相鄰元素具有前驅和後繼關係

operation

initstack

前置條件:棧不存在輸入:無功能:棧的初始化輸出:無後置條件:構造乙個空棧

destroystack

前置條件:棧已存在

輸入:無

功能:銷毀棧

輸出:無

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

push

前置條件:棧已存在

輸入:元素值x

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

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

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

pop前置條件:棧已存在

輸入:無

功能:刪除棧頂元素

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

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

gettop

前置條件:棧已存在

輸入:無

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

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

後置條件:棧不變

empty

前置條件:棧已存在輸入:無功能:判斷棧是否為空輸出:如果棧為空,返回1,否則,返回0後置條件:棧不變

endadt

3.棧的順序儲存結構及實現

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

順序棧類的宣告

const intstacksize=100;

template

class seqstack

;~seqstack( );

void push ( t x );

t pop ( );

t gettop( )

boolempty ( )

private:

t data[stacksize];

inttop;}

順序棧的實現——入棧

順序棧的實現——出棧

4.兩棧共享空間:使用乙個陣列來儲存兩個棧,讓乙個棧的棧底為該陣列的始端,另乙個棧的棧底為該陣列的末端,兩個棧從 各自的端點向中間延伸。

兩棧共享空間的宣告:

const intstacksize=100;

template

classbothstack

~bothstack( );

void push(inti, t x);

t pop(inti);

t gettop(inti);

boolempty(inti);

private:

t data[stacksize];

inttop1, top2;

};兩棧共享空間的實現——插入

兩棧共享空間的實現——刪除

t pop(inti);

t bothstack::pop(inti)

if (i2) //將棧2的棧頂元素出棧

}兩棧共享空間的實現——讀取棧i當前的棧頂元素

t gettop(inti);

template

t bothstack::gettop(inti)

if(i2)

兩棧共享空間的實現——判斷棧i是否為空棧

boolempty(inti);

template

boolbothstack::empty(inti)

if(i2)

5.棧的鏈結儲存結構及實現

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

鏈棧的類宣告

template

class linkstack

~linkstack( );

void push(t x);

t pop( );

t gettop( )

boolempty ( )

private:

node *top;

}鏈棧的實現——插入

6.順序棧和鏈棧的比較

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

空間效能:?順序棧:有元素個數的限制和空間浪費的問題。?鏈棧:沒有棧滿的問題,只有當記憶體沒有可用空間時才會出現棧滿,但是每個元素都需要乙個指標域,從而產生了結構性開銷。總之,當棧的使用過程中元素個數變化較大時,用鏈棧是適宜的,反之,應該採用順序棧

棧的應用舉例—遞迴

1 遞迴的定義

子程式(或函式)直接呼叫自己或通過一系列呼叫語句間接呼叫自己,是一種描述問題和解決問題的基本方法。

2 遞迴的基本思想

問題分解:把乙個不能或不好解決的大問題轉化為乙個或幾個小問題,再把這些小問題進一步分解成更小的小問題,直至每個小問題都可以直接解決。

3 遞迴的要素

⑴遞迴邊界條件:確定遞迴到何時終止,也稱為遞迴出口;

⑵遞迴模式:大問題是如何分解為小問題的,也稱為遞迴體。

特殊線性表——佇列

1.佇列的邏輯結構

空佇列:不含任何資料元素的佇列。

佇列:只允許在一端進行插入操作,而另一端進行刪除操作的線性表。允許插入(也稱入隊、進隊)的一端稱為隊尾,允許刪除(也稱出隊)的一端稱為隊頭。

佇列的操作特性:先進先出(filo)

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

adt queue

data

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

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

operation

initqueue

前置條件:佇列不存在

輸入:無

功能:初始化佇列

輸出:無

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

destroyqueue

前置條件:佇列已存在

輸入:無

功能:銷毀佇列

輸出:無

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

enqueue

前置條件:佇列已存在

輸入:元素值x

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

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

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

dequeue

前置條件:佇列已存在

輸入:無

功能:刪除隊頭元素

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

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

getqueue

前置條件:佇列已存在

輸入:無

功能:讀取隊頭元素

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

後置條件:佇列不變

empty

前置條件:佇列已存在輸入:無功能:判斷佇列是否為空輸出:如果隊列為空,返回1,否則,返回0

後置條件:佇列不變

endadt

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

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

隊空:front=rear

隊滿:front=rear

隊滿的條件:(rear+1) mod queuesize=front

迴圈佇列類的宣告

const intqueuesize=100;

template

class cirqueue

~ cirqueue( );

void enqueue(tx);

t dequeue( );

t getqueue( );

boolempty( )

private:

t data[queuesize];

intfront, rear;

};迴圈佇列的實現——入隊

template

void cirqueue::enqueue(tx)

迴圈佇列的實現——出隊

template

t cirqueue::dequeue( )

迴圈佇列的實現——讀隊頭元素

template

t cirqueue::getqueue( )

4.佇列的鏈結儲存結構及實現

佇列的鏈結儲存結構——鏈佇列

鏈佇列類的宣告

template

class linkqueue

private:

node *front, *rear;};

鏈佇列的實現——建構函式

鏈佇列的實現——入隊

template

void linkqueue::enqueue(tx)

鏈佇列的實現——出隊

template

tlinkqueue::dequeue( )

迴圈佇列和鏈佇列的比較

時間效能:

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

空間效能:

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

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

第三章 棧和佇列

棧和佇列 一 棧 1 棧的定義 棧是限定僅在表尾進行插入和刪除操作的線性表,允許插入和刪除的一端稱為棧頂,另一端稱為棧底,不含任何資料元素的棧稱為空棧。2 在任何時候出棧的元素都只能是棧頂元素,即最後最後入棧者最先出棧。所以棧中元素除了具有線性關係外,還具有後進先出的特性。3 棧的抽象資料型別定義 ...

第三章 棧和佇列

棧和佇列是兩種常用的資料結構,同時又是操作受限的線性表,也是兩種重要的抽象資料型別。1 1棧是限定僅在表尾進行插入和刪除操作的線性表。棧中元素具有線性關係和後進先出的特性。2雖然對插入和刪除操作的位置限制減少了棧的靈活性,但同時也使得棧的操作更有效更容易實現。3棧的儲存結構分兩種,一種是順序儲存結構...

第三章 棧和佇列

第三章棧和佇列 一 棧1.棧 限定僅在表尾進行插入和刪除操作的線性表 允許插入和刪除的一端稱為棧頂 另一端稱為棧底 2.空棧 不含任何資料元素的棧。3.在任何時候出棧的元素都只能是棧頂元素,即最後入棧者最先出棧,具有後進先出的特性。4.棧的抽象資料型別定義 1 push 輸入 元素值 x 輸出 如果...