chapter4棧與佇列 1 順序棧實現

2021-09-27 21:29:20 字數 3081 閱讀 3420

對於棧來講,理論上線性表的操作特性它都具備,可由於它的特殊性,所以針對它在操作上會有些變化。特別是插入和刪除操作,我們改名為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 同線性表。元素具有相同的型別,相鄰元素具有...