引言:
使用鏈表實現棧存在“對malloc和free的調用開銷昂貴”的缺點,特別是與指針操作的例程相比尤其如此。利用數組實現棧可以避免了指針。但它的缺點是可能存在空間的浪費。
分析描述:
數組棧的結點元素。
#ifndef ERROR
#define ERROR (0)
#endif
#ifndef OK
#define OK (!ERROR)
#endif
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef int SElemType;
typedef struct SqStack{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack, *pStack;
pStack S;
棧的初始化。
pStack InitStack(pStack S)
{
S = (pStack)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if(S == NULL){
return ERROR;
}
S->base = (SElemType *)S;
S->top = S->base;
S->stacksize = STACK_INIT_SIZE;
return S;
}
入棧操作。
pStack Push(pStack S, SElemType e)
{
if((S->top - S->base) >= S->stacksize){
S->base = (SElemType *)realloc(S, (S->stacksize + STACKINCREMENT)*sizeof(SElemType));
if(S->base == NULL)
return ERROR;
S->top = S->base + S->stacksize;
S->stacksize += STACKINCREMENT;
}
*S->top++ = e;
return S;
}
出棧操作。
SElemType Pop(pStack S)
{
if(S->top == S->base)
return 0;
return *(--S->top);
}
取棧頂元素。
SElemType GetTop(pStack S)
{
if(S->top == S->base)
return ERROR;
return *(S->top - 1);
}
求棧的長度。
int GetLength(pStack S)
{
int length = 0;
if(S->top == S->base)
return 0;
pStack Tmp = S;
while(Tmp->top-- != Tmp->base)
length++;
return length;
}