|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
#define STACK_INIT_SIZE 100 //存储空间初始分配量
4 x! F5 b: D- n; q#define STACKINCREMENT 10 //存储空间分配增量
: E% h& L, T: V# L# w$ mtypedef struct{
; U z, d+ Z+ |4 @SElemType *base //在栈构造之前和销毁之后,base的值为NULL1 ~6 \' u! [( \) J
SElemType *top //栈顶指针
; o( G; l' ?& Y, x' V! D/ zint stacksize; //当前已分配的存储空间,以元素为单位
0 e* V& _; W8 K, h}SqStack;* c; u& {( c. T3 [" Q
//---------基本操作的函数原型说明-----------
3 h/ U' T) h0 r2 J. Y$ ^+ rStatus InitStack(SqStack &S);
9 j7 W; ?2 O! \0 F //构造一个空栈S
+ V1 q( h0 O7 D. P3 Y# a: hStatus DestroyStack(SqStack &S);8 w" e9 ~1 @8 |1 Y& Y
//销毁栈S,S将不存在
9 J h* A) e, O+ i# jStatus ClearStack(SqStack &S);
9 b- D) B4 w2 \4 I$ M4 O; z //把S置为空栈
# O; U7 H6 s1 T" KStatus StackEmpty(SqStackS);0 p% ]. k! }. y7 C$ R0 U- e
//若栈S为空栈,则返回TRUE,否则返回FALSE
8 c9 r( G3 h) l' D5 bInt StackLength(SqStack S);
3 t: A J5 W& \0 O5 q4 u //返回栈的元素个数,即栈的长度
) k. m* `4 a9 d4 wStatus GetTop(SqStack S,SElemType &e);
- M% L/ F- q. M2 \( q. v //若栈不空,则用e的值返回S的栈顶元素,并返回OK,否则返回ERROR* x3 c/ O4 ]1 G. \/ u
Status Push(SqStack&S,SElemType e);# x) f6 {7 d, Y
//插入元素e为新的栈顶元素. E7 o, I, S/ {/ S$ Q
Status Pop(SqStack&S,SElemType &e);
4 t* n' ]% Q+ B; q% N. V3 V //若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK,否则返回ERROR5 |" {! q5 n4 O7 z; b$ z
Status StackTraverse(SqStackS,Status(*visit)());4 A! R. _" V) w$ y
//从栈底到栈顶依次对栈中每个元素调用函数visit()。一旦visit()失败,则操作失败。
- c8 F% m5 j" \# j( D& C//---------基本操作的算法描述(部分)-----------+ b& o) _# i2 P5 I* }" e
Status InitStack(SqStack &S){
$ P/ d! c p8 p% e* v+ O//构造一个空栈S B2 c! g; R% F0 o- e
S.base=(SElemType * )malloc(STACK_INIT_SIZE* sizeof(SElemType));; c5 V; Z' E( G5 E
if(!S.base)exit(OVERFLOW); //存储分配失败
: `/ c6 {/ p: Y) @9 X( ES.top=S.base;, f3 Z# Y5 Z" C" p& k4 p
S.stacksize=STACK_INIT_SIZE;
; ~8 E+ P; B6 I. ]* y hreturn OK;- {1 W8 Y$ U# j% S K( S/ Q
}InitStack
/ j5 G( f# f# Y( P' QStatus GetTop(SqStack s,SElemType &e){: E3 m/ x8 p6 b& H% k
//若栈不空,则用e的值返回S的栈顶元素,并返回OK,否则返回ERROR) O5 O, V7 t5 h9 ~
if(S.top==S.base)return ERROR;4 j/ G v) c7 p, G
e=*(S.top-1);
+ p) V5 G" p" U, q, `return OK;/ H+ x% U& \' W' @* q( D
}//GetTop
3 P9 r" m4 x# R9 N' A8 T, U" ?, U, MStatus Push(SqStack S,SElemType &e){
) z- j7 F5 c7 _) b; R//若栈不空,则用e的值返回S的栈顶元素,并返回OK,否则返回ERROR5 o6 l" k4 J$ n" d" \3 r C( Q
if(S.top-S.base>=S.stacksize){//栈满,追加存储空间5 v" ]5 U: R6 D
S.base=(SElemType *)realloc(S.base,/ S) H, H& ?: T6 q+ |
(s.stacksize+STACKINCREMENT)* sizeof(SElemType));
3 c0 O, [* F; [* F D; F! cif(!S.base)exit(OVERFLOW);//存储分配失败) m& y9 A4 Q- g) _" E5 u
S.top=S.base+S.stacksize;
V/ F9 @# ^) H8 N, A, @S.stacksize+=STACKINCREMENT;/ r, m. j' t& G, |! p% }- n
}( d$ U9 b8 n* ]
*S.top++=e;7 }- }$ l+ K% c- d' M9 A4 G
return OK;" G2 W, `& L' k, P
}//push$ @$ Z1 o6 z' Y7 R. T/ u2 R
Status Pop(SqStack &S,SElemType&e){
! W7 G6 G: G; `$ W6 k//若栈不空,则删除S的栈顶元素,则e返回其值,并返回OK;否则返回ERROR
" K; r2 y1 a1 R' `, bif(S.top==S.base)return ERROR;
' a7 ]# C. k; {4 ne=*--S.top;
+ e7 g* y7 t+ h" ` e9 V ~- E7 z Vreturn OK;
- o" \5 i! c+ F}//Pop |
|