栈ADT的数组实现

时间:2023-03-08 18:52:55
栈ADT的数组实现
/* 栈的数组实现声明 */
struct StackRecord;
typedef struct StackRecord *Stack; #define MinSstackSize 5
#define EmptyTOS -1
struct StackRecord
{
int Capacity;
int TopOfStack;
ElementType *Array;
}; /* 栈的创建-数组实现 */
Stack
CreateStack( int MaxElements )
{
Stack S;
if( MaxElements < MaxStackSize )
ERROR("stack is too small");
S = malloc(sizeof( struct StackRecord ));
if( S == NULL )
FatalError("out of Space");
S->Array = malloc(sizeof(ElementType) * MaxElements);
if( S->Array == NULL )
Fatalerror("out of space");
S->Capacity = MaxElements;
MakeEmpty( S );
return S;
}
/* 数组事项创建空栈的例程 */
void
MakeEmpty( Stack S )
{
S->TopOfStack =EmptyTOS;
}
/* 释放栈 */
void
DisposeStack( Stack S )
{
if(S != NULL ){
free( S->Array );
free( S );
}
}
/* 监测一个栈是否空栈的的例程 */
int
IsEmpty( Stack S )
{
return S->TopOfStack == -;
}
/* 判断栈满 */
int
IsFull( Stack S )
{
return TopOfStack == Capacity - ;
}
/* 进栈的例程 */
void
Push( ElementType X, Stack S)
{
if( IsFull( S ) )
ERROR("stack is full");
else
S->Array[ ++S->TopOfStack ] = X;
}
/* 返回栈顶的例程 */
ElementType
Top( Stack S )
{
if( IsEmpty( S ) ){
ERROR("stack is empty");
return ;//避免无
}
else
return S->Array[ S->TopOfStack ];
} /* Pop操作 */
/* TopOfStack相当于指向栈顶元素的指针 */
/* TopOfStack-- 只是让指针下移,但是没消除原来数据,下次要Push就直接覆盖*/
/* 并且S->Array 的栈空间设定好了,即MaxElements */ void
Pop( Stack S )
{
if( IsEmpty( S ) )
ERROR("Empty stack");
else
S->TopOfStack--;
}
ElementType
PopAndTop( Stack S )
{
if( !IsEmpty( S ) )
return S->Array[ S->TopOfStack-- ];
}

这个数据结构的核心是:Stack S,S为指向结构的指针,结构里面内含指针,用来指向malloc出的内存(数组)地址

一个结构体成员包括TopOfStack(指向栈顶元素的下标(指针))、ElementType *Array(该指针指向malloc出来的一块连续内存,相当于数组)、Capacity(表示这个栈的容量 == MaxElements)

malloc出来的空间是NULL            FataError()

pop 和 Top 空栈 或MaxElements < MinStackSize                      Error()

不过没找到这两个函数,好像是异常处理?