資料結構與演算法 第三章 棧c實現,使用鍊錶結構

2022-07-13 15:15:16 字數 4791 閱讀 7117

棧的本質是乙個表,但它限制插入和刪除只能在乙個位置上進行。這個特殊的位置是表的末端,叫做棧頂(top)。棧的基本操作有push和pop兩種。這裡有兩種比較流行的棧的實現方式:一種是用鍊錶實現,另一種是用陣列實現。這裡,我們先給出鍊錶實現的c原始碼。

stacklist.h標頭檔案定義如下。具體內容可參見《資料結構與演算法分析:c語言描述》第三章。

1

#ifndef _stack_list_h

2#define

_stack_list_h34

typedef

intelementtype;

5typedef

struct

_node

6node;

10typedef node

*ptrtonode;

11typedef ptrtonode stack;

1213

intisempty( stack s );

14stack createstack(

void

);15

void

disposestack( stack s );

16void

makeempty( stack s );

17void

push( stack s, elementtype x );

18elementtype top( stack s );

19void

pop( stack s );

2021

#endif

/* _stack_list_h */

stacklist.c

1

/************************************

2* stack implemention by list

3* **********************************/4

5#include

<

stdio.h

>

6#include

<

stdlib.h

>

7#include

"stacklist.h"8

910//判斷s是否為空

11//

若為空,返回1,若不為空,返回0

12int

isempty( stack s )

1316

17//

創造乙個新棧

18//

返回棧指標

19stack createstack(

void)20

2930

//清空棧

31void

makeempty( stack s )

3241

42//

銷毀棧43

void

disposestack( stack s )

4449

50//

壓棧操作

51void

push( stack s, elementtype x )

5263}64

65//

取棧頂元素

66elementtype top( stack s )

6774

75//

彈棧操作

76void

pop( stack s )

7788}89

90//

列印棧的元素

91void

printstack( stack s )

9298

99/*

**************************************

*/100

intmain()

101

用陣列實現棧結構,這種方法更加流行一些。因為,棧在應用過程中,任一時刻棧元素的實際個數並不會太大。因此,宣告乙個陣列足夠大而不至於浪費太多的空間,做到這一點並不困難。下面貼出陣列實現的棧**:

stackarray.h

1

#ifndef _stackarray_h

2#define

_stackarray_h34

typedef

intelementtype;

5typedef

struct

_stackrecord

6stackrecord;

11typedef stackrecord

*stack;

1213

intisempty( stack s );

14int

isfull( stack s );

15stack createstack(

intmaxelements );

16void

disposestack( stack s );

17void

makeempty( stack s );

18void

push( stack s, elementtype x );

19elementtype top( stack s );

20void

pop( stack s );

21elementtype topandpop( stack s );

22void

printstack( stack s );

2324

#endif

/* _stackarray_h */

stackarray.c

1

/***************************************

2* stack implentation by array

3* an popular method

4* author: qiqi

5* date: 2011-6-2

6* *************************************/7

8#include

<

stdio.h

>

9#include

<

stdlib.h

>

10#include

"stackarray.h"11

12#define

emptytos ( -1 ) /* 當棧為空時,棧頂指標置為1 */

13#define

minstacksize ( 5 ) /* 棧最小為5 */

1415

//判斷是否為空

16int

isempty( stack s )

1720

21//

判斷棧是否已滿

22int

isfull( stack s )

2326

27//

建立乙個棧

28stack createstack(

intmaxelements )

2937

38s

=( stack )malloc(

sizeof

( stackrecord ) );

39if

( s

==null )

404445s

->

array

=( elementtype

*)malloc(

sizeof

( elementtype ) 46*

maxelements );

47if

( s->

array

==null )

485253s

->

topofstack =-

1;54s

->

capacity

=maxelements;

5556

return

s;57}58

59//

銷毀乙個棧

60void

disposestack( stack s )

6167}68

69//

清空乙個棧

70void

makeempty( stack s )

7174

75//

壓棧操作

76void

push( stack s, elementtype x )

7783

else84s

->

array[ ++s

->

topofstack ] =x;

85}8687

//取棧頂元素

88elementtype top( stack s )

8995

96//

彈棧操作

97void

pop( stack s )

98104

else

105109

}110

111//

取棧頂元素,並彈棧操作

112elementtype topandpop( stack s )

113119

120//

列印棧元素

121void

printstack( stack s )

122128

129130

/***************************************

*/131

intmain()

132

資料結構與演算法分析 第三章 棧

棧是限制插入和刪除只能在乙個位置上進行的表,該位置是表的末端,叫做棧頂 top 對棧的基本操作有push 進棧 和pop 出棧 前者相當於插入,後者則是刪除最後插入的元素。棧是後進先出的 lifo 表,一般的模型中,存在某個元素位於棧頂,而該元素是唯一的可見元素。只有棧頂元素是可以訪問的 棧是乙個表...

資料結構 第三章 棧與佇列

3.1 棧 3.1.1 抽象資料型別棧的定義 棧是限定僅在表尾進行插入或刪除操作的線性表。因此,對棧來說,表尾端有其特殊含義,稱為棧頂。相反地,表頭端稱為棧底。棧是後進先出 lifo 的線性表。基本操作 top 返回棧頂元素 pop 彈出棧頂元素 push a 將元素a壓入棧 empty 判斷是否為...

資料結構 第三章 棧與佇列

定義 限定僅在表尾進行插入和刪除操作的線性表。即後進先出的線性表 last in first out 表尾即棧頂top,表頭即棧低bottom。儲存方式 順序棧 鏈棧 順序棧 一組位址連續的儲存單元,一次存放自棧低到棧頂的資料元素。結構 兩個指標top,base,乙個int size描述棧的大小 空...