棧的本質是乙個表,但它限制插入和刪除只能在乙個位置上進行。這個特殊的位置是表的末端,叫做棧頂(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描述棧的大小 空...