第三章 1 棧和佇列 棧的表示及實現

2022-08-26 17:24:15 字數 2105 閱讀 3469

前言:

棧和佇列 是兩種重要的線性結構。從資料結構角度來看,棧和佇列也是線性表,它的特殊性在於其操作是線性表的子集,是操作受限的線性表,因此可以稱作限定性的資料結構。

(限定性:如、人為的規定線性表只能從表尾插入和刪除結點資料元素,那麼這樣的線性表就是棧)

目錄:1、棧

2、棧的應用舉例

3、棧與遞迴的實現

4、佇列

5、離散事件模型

正文:棧的定義

棧(stack) 如上所說,就是限定只能在表尾進行插入和刪除的線性表。表尾 稱為 棧頂(top), 表頭 稱為 棧底 (bottom),沒有資料元素 稱為 空棧

假設棧 s=(a1, a2, a3 ... an); 那麼 a1 為棧底元素,an 為棧頂元素。因為棧的修改是按照 後進先出的原則進行,因此又稱棧為 後進先出(last in first out)的線性表。可用下圖表示:

棧的表示和實現

棧和線性表一樣也有兩種表示形式

一般來說,在初始化棧的時候不應該限定棧的最大容量。我們在此的做法是:先為棧分配乙個基本容量,然後在應用的過程中,當棧的空間不夠用的時候再逐段誇大。

因此需設定兩個常量: stack_init_size(初始分配量) 和 stackincrement(分配增量)

元素和棧指標的關係圖:

c語言中,講順序棧描述如下:

typedef struct sqstack;

實現**:

#include#include

#define true 1

#define false 0

#define ok 1

#define error 0

#define infeasible -1

#define overflow -2

#define stack_init_size 100

#define stackincrement 10

//status是函式的型別,其值是函式結果狀態碼

typedef int

status;

typedef

intselemtype;

typedef

struct

sqstack;

//構造空棧

status initstack(sqstack &s)

//插入元素 (入棧)

status push(sqstack &s,selemtype e)

*s.top=e;

s.top++;

return

ok;}

//刪除元素(出棧)

status pop(sqstack &s,selemtype &e)

else

return

ok;}

void printallvalues(sqstack &s)

printf(

"base:%p\n

",s.base);}

void

main()

printf(

"%s\n

","進行入棧操作push:");

push(s,2);

push(s,5);

push(s,

66);

push(s,

31);

printf(

"%s\n

","s:");

printallvalues(s);

printf(

"\n%s\n

","出棧後:");

selemtype e;

pop(s,e);

printallvalues(s);

printf(

"\n出棧元素:%d\n

",e);

}

執行結果:

棧的鏈式表示:               

因為棧的操作是線性表操作的子集,所以鏈式棧的實現比較容易,在此也不予以實現來了。

第三章 棧和佇列

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

第三章 棧和佇列

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

第三章 棧和佇列

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