對於棧來講,理論上線性表的操作特性它都具備,可由於它的特殊性,所以針對它在操作上會有些變化。特別是插入和刪除操作,我們改名為push和pop,英文直譯的話是壓和彈,更容易理解。你就把它當成是彈夾的子彈壓入和彈出就好記憶了,我們一般叫進棧和出棧。
棧的抽象資料型別
adt 棧(stack)
data
同線性表。元素具有相同的型別,相鄰元素具有前驅和後繼關係。
operation
initstack
(*s)
: 初始化操作,建立乙個空棧s。
destroystack
(*s)
: 若棧存在,則銷毀它。
clearstack
(*s)
: 將棧清空。
stackempty
(s): 若棧為空,返回true,否則返回false。
gettop
(s,*e)
: 若棧存在且非空,用e返回s的棧頂元素。
push
(*s, e)
: 若棧s存在,插入新元素e到棧s中並成為棧頂元素。
pop(*s,
*e): 刪除棧s中棧頂元素,並用e返回其值。
stacklength
(s): 返回棧s的元素個數。
endadt
由於棧本身就是乙個線性表,那麼上一章我們討論了線性表的順序儲存和鏈式儲存,對於棧來說,也是同樣適用的。
下面上**:
elementtype.h 元素型別定義
#ifndef element_h_included
#define element_h_included
#define max_size 100
#define true 1
#define false 0
// 用來定義一些常用的資料元素
typedef
struct
elementtype;
#endif
// element_h_included
seqstack.h 順序棧標頭檔案(包含棧資料結構、函式方法宣告)#ifndef seqstack_h_included
#define seqstack_h_included
/******************************
* project: 第三章棧與佇列
* 這裡是順序棧 用陣列來實現
* ******************************/
#include
#include
#include
"element.h"
//定義一些棧的資料結構
typedef
struct seqstackseqstack;
//定義一下棧的方法
void
initseqstack
(seqstack* seqstack)
;//向棧中壓入元素 返回成功與否
intpushseqstack
(seqstack* seqstack,elementtype element)
;//出棧 返回出站元素,以指標的方式返回 返回值表示出棧是否成功
intpopseqstack
(seqstack* seqstack,elementtype* element)
;//清空棧
void
clearseqstack
(seqstack* seqstack)
;//返回棧頂元素 與出棧一樣,只是不需要返回狀態了。
#endif
// seqstack_h_included
seqstack.c 順序棧實現檔案(包含棧函式方法實現)#include
"seqstack.h"
//初始化棧
void
initseqstack
(seqstack* seqstack)
//向棧中壓入元素 返回成功與否
intpushseqstack
(seqstack* seqstack,elementtype element)
seqstack->top++
; seqstack->elements[seqstack->top]
= element;
seqstack->length++
;return1;
}//出棧 返回出站元素,以指標的方式返回,返回值表示出棧是否成功
intpopseqstack
(seqstack* seqstack,elementtype* element)
*element = seqstack->elements[seqstack->top]
; seqstack->top--
; seqstack->length--;}
void
clearseqstack
(seqstack* seqstack)
main.c 測試檔案#include
#include
#include
"seqstack.h"
elementtype datas=
,,};
void
testseqstack()
;int
main()
void
testseqstack()
elementtype element;
popseqstack
(&seqstack,
&element)
;printf
("當前出棧元素為:%d\t%s\n"
,element.id,element.name )
;printf
("當前棧內元素為\n");
for(
int i =
0;i < seqstack.length;i++
)free
(&seqstack)
;}
chapter4棧與佇列 2 鏈棧實現
elementtype.h 元素型別定義 ifndef element h included define element h included define max size 100 define true 1 define false 0 用來定義一些常用的資料元素 typedef struct...
Chapter 3 棧與佇列
2.佇列 3.棧與佇列的應用 通常,棧可定義為只允許在表的末端進行插入和刪除的線性表。後進先出 lifo 棧的基本操作 解答演算法題時,若題幹未做出限制,則可直接使用這些基本的操作函式。p60 p62 利用棧底位置相對不變的特性,可讓兩個順序棧共享乙個一維資料空間,將兩個棧的棧底分別設定在共享空間的...
棧與佇列(1)
棧 限定僅在表尾進行插入和刪除操作的線性表 棧頂 允許插入和刪除的一端 棧底 不允許插入和刪除的一端 空棧 不含任何資料元素的棧 後進先出的線性表,lifo結構。進棧 棧的插入 出棧 棧的刪除 元素數量多,出棧的變化會更多。adt 棧 stack data 同線性表。元素具有相同的型別,相鄰元素具有...