前言:
棧和佇列 是兩種重要的線性結構。從資料結構角度來看,棧和佇列也是線性表,它的特殊性在於其操作是線性表的子集,是操作受限的線性表,因此可以稱作限定性的資料結構。
(限定性:如、人為的規定線性表只能從表尾插入和刪除結點資料元素,那麼這樣的線性表就是棧)
目錄: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 輸出 如果...