|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
#define STACK_INIT_SIZE 100 //存储空间初始分配量9 C& X& K$ G( C G
#define STACKINCREMENT 10 //存储空间分配增量 o/ P! F2 }, W5 L6 v' D
typedef struct{" U! t0 u% Q9 `5 T: m! U1 m
SElemType *base //在栈构造之前和销毁之后,base的值为NULL
$ u) H9 \' e- ^. [0 K6 [, bSElemType *top //栈顶指针3 m! j. p& @* h7 `
int stacksize; //当前已分配的存储空间,以元素为单位) h) O5 s4 a$ D& W# z2 _( S
}SqStack;
8 p9 D% W$ W# H& D! W9 V* Y//---------基本操作的函数原型说明-----------2 m. q% p; L( ?% u
Status InitStack(SqStack &S); E' l* `5 t" B3 t
//构造一个空栈S
2 @4 e! v$ X! I5 ~" c1 B2 wStatus DestroyStack(SqStack &S);
0 m/ z/ e# F0 v! r6 n //销毁栈S,S将不存在
% @* O6 E \! J# v& e, v1 D& f( F" v1 XStatus ClearStack(SqStack &S);
6 z, t% g: _* V //把S置为空栈* Z9 b& d# H* z
Status StackEmpty(SqStackS);1 d, _ E$ I! {, v% n8 U# K1 \
//若栈S为空栈,则返回TRUE,否则返回FALSE0 f* F2 K$ |* d9 A+ r+ Q
Int StackLength(SqStack S); |7 A- L2 g5 ~" U( U) ^5 P" v
//返回栈的元素个数,即栈的长度
" x" U+ R4 C5 I- W8 \# ^9 vStatus GetTop(SqStack S,SElemType &e);1 S6 N! X, b N0 b1 W; e7 I* Q7 H5 Z9 v
//若栈不空,则用e的值返回S的栈顶元素,并返回OK,否则返回ERROR
( q9 [6 t1 q# G( `Status Push(SqStack&S,SElemType e);
* q- S4 J9 Z+ ?. e0 o. x; C //插入元素e为新的栈顶元素
# w; i& ?2 X+ r7 h. u: v+ _Status Pop(SqStack&S,SElemType &e);
9 f G5 {$ c+ @) B5 l8 v //若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK,否则返回ERROR/ Z, h) z! i0 i) l- O7 \! a' X
Status StackTraverse(SqStackS,Status(*visit)()); ^0 K+ j: p! n5 E5 X/ W, j2 G
//从栈底到栈顶依次对栈中每个元素调用函数visit()。一旦visit()失败,则操作失败。
# k* d0 o8 }) `" Z$ o5 U//---------基本操作的算法描述(部分)-----------
E* T) D |" H/ A5 H, g% L& }% lStatus InitStack(SqStack &S){6 @6 y; J+ x! g- |/ a
//构造一个空栈S
/ j1 Y1 s, K1 g. A& ?( J0 rS.base=(SElemType * )malloc(STACK_INIT_SIZE* sizeof(SElemType));
3 W: J6 A, }) @if(!S.base)exit(OVERFLOW); //存储分配失败
5 C1 e* o, \' L8 {# T& Q+ c i7 _S.top=S.base;
& z Z( v& l0 ^3 {* `S.stacksize=STACK_INIT_SIZE;/ R# h5 k6 G# F! `! }7 V: S) E1 o5 H
return OK;
5 D) J. j' A2 {8 ]! O" L}InitStack
# S |0 I/ O2 G- y$ o! q7 m! C$ q+ IStatus GetTop(SqStack s,SElemType &e){
8 c2 r- }- \* ^& M6 G//若栈不空,则用e的值返回S的栈顶元素,并返回OK,否则返回ERROR
5 g8 j" l* p$ J. J- qif(S.top==S.base)return ERROR;
% c" P4 B6 K$ ^e=*(S.top-1);
- q( o! u! C6 [3 M4 Ereturn OK;
; F* M2 j; T. u% H8 D7 m, v# R}//GetTop( f& {( m2 R4 P3 c/ S4 K
Status Push(SqStack S,SElemType &e){9 }! M1 H4 e* X0 F3 v) r
//若栈不空,则用e的值返回S的栈顶元素,并返回OK,否则返回ERROR
5 ?6 _9 c7 P5 o4 |2 uif(S.top-S.base>=S.stacksize){//栈满,追加存储空间
; `% {! B. j+ F. X1 J' OS.base=(SElemType *)realloc(S.base,% J6 R" ^8 p6 L7 Z' w; L
(s.stacksize+STACKINCREMENT)* sizeof(SElemType));4 U: C& i3 X# a, f) X
if(!S.base)exit(OVERFLOW);//存储分配失败3 @. D4 G; _* f( W9 H( e' B# \: {4 ]. r
S.top=S.base+S.stacksize;. _( @, R2 L/ s' D: W/ E M( @
S.stacksize+=STACKINCREMENT;
, h$ N, l: _/ D! l5 n}# f2 A% `6 n$ W
*S.top++=e;
2 i; W7 T o+ } Jreturn OK;6 Y+ {, f! r0 z6 F$ f0 U
}//push: f' {3 m E- u: V5 u
Status Pop(SqStack &S,SElemType&e){
# d3 Z# T: W/ b( X. S( C% [//若栈不空,则删除S的栈顶元素,则e返回其值,并返回OK;否则返回ERROR1 b3 |* ?% a* r
if(S.top==S.base)return ERROR;
5 q P3 F; p1 u# Xe=*--S.top;9 \% v! N$ D) i8 j2 O
return OK;; g' q0 T% X0 L2 d# E/ y: `7 ]
}//Pop |
|