相關知識
棧的基本概念
棧是一種運算受限的線性表。其限制是僅允許在表的一端進行插入和刪除運算,這一端被稱為棧頂。棧既可以採用順序儲存,也可以採用鏈結儲存來實現。下面給出了一種基於順序儲存的棧的實現方案:
如圖 1 所示:該棧儲存了 4 個元素 ,其中 12 是棧頂元素。
這種實現方案將棧元素儲存在一片連續的空間中,棧相關的三個屬性元素data、top和max介紹如下:
data: 給出棧儲存空間的起始位址;
top: 存放棧頂元素的位置編號;
max: 指明棧儲存空間中最多可儲存的資料元素個數
特別說明:空間的開始位址為data,連續空間裡的位置編號從data所指的開始位置起,到該空間的結束位置,編號依次是0,1,2,…,max-1。在圖 1 的示例中max=6。棧頂元素的位置編號由top給出。
棧結構的定義(c)
基於data、top、max組織成的棧結構如下所示:
struct seqstack
;
為了討論簡單,我們假設棧元素的資料型別為整數:
typedef
int t;
// 棧元素#的資料型別
據此,只要給定指向該結構的一指標 ss ,就可對棧進行進棧出棧操作。
進行進棧操作時,新進棧的元素儲存在 top+1 位置,進棧後 top 加 1 ,這時的狀態則如圖 2 所示。
進行出棧操作時,將位置編號為 top 的元素出棧,出棧後 top 減去 1 ,這時的狀態則如圖 3 所示。
順序棧的操作
以順序儲存的棧為例,我們定義如下操作:
建立棧:
建立乙個最多可以儲存 maxlen 個元素的順序棧。具體操作函式定義如下:
seqstack*
ss_create
(int maxlen);
釋放棧空間:
釋放棧所占用的空間。具體操作函式定義如下:
void
ss_free
(seqstack* ss);
清空乙個棧:
將棧中元素清空。具體操作函式定義如下:
void
ss_makeempty
(seqstack* ss);
判斷棧是否為滿:
若棧為滿,則返回 true,否則返回false。具體操作函式定義如下:
bool
ss_isfull
(seqstack* ss);
判斷棧是否為空:
若棧為空,則返回true,否則返回false。具體操作函式定義如下:
bool
ss_isempty
(seqstack* ss);
求棧元素個數:
獲取棧元素個數。具體操作函式定義如下:
int
ss_length
(seqstack* ss);
將元素 x 進棧:
將 x 進棧,若滿棧則無法進棧,返回false,否則返回true。具體操作函式定義如下:
bool
ss_push
(seqstack* ss, t x);
出棧:
出棧的元素放入 item 。若出棧成功(棧不為空),則返回true;否則(空棧),返回false。具體操作函式定義如下:
bool
ss_pop
(seqstack* ss, t &item);
獲取棧頂元素:
獲取棧頂元素放入 item 中。若獲取失敗(空棧),則返回false,否則返回true。具體操作函式定義如下:
bool
ss_top
(seqstack* ss, t & item);
列印棧中元素:
從棧底到棧頂列印出所有元素。具體操作函式定義如下:
void
ss_print
(seqstack* ss)。
#include
#include
#include
"seqstack.h"
/*建立乙個棧*/
seqstack*
ss_create
(int maxlen)
/*釋放乙個棧*/
void
ss_free
(seqstack* ss)
/*清空乙個棧*/
void
ss_makeempty
(seqstack* ss)
bool
ss_isfull
(seqstack* stack)
// 判斷棧是否為滿。為滿返回true,否則返回false。
bool
ss_isempty
(seqstack* stack)
// 判斷棧是否為空。為空返回true,否則返回false。
intss_length
(seqstack* stack)
// 獲取棧元素個數
bool
ss_push
(seqstack* stack, t x)
// 將元素x進棧,若滿棧則無法進棧,返回false,否則返回true
stack-
>top++
; stack-
>data[stack-
>top]
=x;return
true;}
bool
ss_pop
(seqstack* stack, t &item)
// 出棧的元素放入item。若出棧成功(棧不為空),則返回true;否則(空棧),返回false。
item = stack-
>data[stack-
>top]
; stack-
>top--
;return
true;}
/*獲取棧頂元素放入item中,空棧則返回false*/
bool
ss_top
(seqstack* ss, t & item)
item = ss-
>data[ss-
>top]
;return
true;}
/*從棧底到棧頂列印出所有元素*/
void
ss_print
(seqstack* ss)
printf
("stack data (from bottom to top):");
int curr=0;
while
(curr<=ss-
>top)
//printf("\n");
}
實現乙個鏈結儲存的棧(資料結構與演算法 棧)
相關知識 鏈結儲存的棧 棧的儲存也可以採用鏈結儲存的方式來實現。下面給出了一種基於鏈結儲存的棧的實現方案 如圖 1 所示 該棧儲存了 3 個元素 其中 56 是棧頂元素。這種實現方案中與棧相關的兩個屬性元素top和len介紹如下 top 指向棧頂結點的指標 len 棧中結點的個數。特別說明 鏈結儲存...
資料結構與演算法 實現乙個鏈結儲存的棧
鏈結儲存的棧實現檔案 include include include lnkstack.h 建立棧 linkstack ls create 釋放棧 void ls free linkstack ls free ls 將棧變為空棧 void ls makeempty linkstack ls ls t...
實現乙個順序儲存的佇列(資料結構與演算法 佇列)
相關知識 佇列是乙個插入操作和刪除操作受到限制的線性表資料結構。佇列的插入和刪除被限制在表的兩端,即插入操作只能在表的一端進行,而刪除操作只能在表的另一端進行,因此佇列又稱先進先出表。順序儲存的佇列 佇列既可以採用順序儲存,也可以採用鏈結儲存來實現。下面給出了一種基於順序儲存的佇列實現方案 該佇列儲...