栈的顺序存储结构实现
用数组来实现栈,首先定义栈类型SqStack,里面有两个指针,一个指向栈底,这个栈底初始化后将被指向数组指针,即第一个数组元素。而另一个一个指针指向栈顶,随着新元素不断被push进来,栈顶指针不断往上涨如何判断满栈了呢,那就要用到SqStack里面的第三个元素stacksize,它指明占空间的大小,即让top指针减去base指针的差去和stacksize比较,如果大于栈空间,则需要重新分配数组大小。同样对于栈的pop则将栈顶元素索取出来并让top减1,如下图所示,top的位置总是数据的上面,所以栈顶的数据应该是top-1。先检测top是否和base相等,因为这是空栈的条件,如果不等,则top必然在base上面,且栈不为空,top-1的位置就当然是栈顶的元素位置。对于获取栈中的数据长度,就是让top-base就可以了。
图示:栈的状态示意图
示例代码
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef int SElemType;
#define STACK_INIT_SIZE 100
#define STACK_INCREMENT 10
typedef struct
{
SElemType *base; /* 在栈构造之前和销毁之后,base值为NULL */
SElemType *top; /* 栈顶指针 */
int stacksize; /* 当前已分配的存储空间,以元素为单位 */
}SqStack;
/* 构造一个空战 */
Status InitStack(SqStack *S)
{
S->base = (SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!S->base)
return ERROR;
S->top = S->base;
S->stacksize = STACK_INIT_SIZE;
return OK;
}
/* 销毁栈S,S不再存在 */
Status DestoryStack(SqStack *S)
{
if(!S->base)
return ERROR;
free(S->base);
S->base = NULL;
S->top = NULL;
S->stacksize = 0;
return OK;
}
/* 把栈S置为空栈 */
Status ClearStack(SqStack *S)
{
if(!S->base)
return ERROR;
S->top = S->base;
return OK;
}
/* 如果栈为空则返回TRUE,否则返回FALSE */
Status StackEmpty(SqStack *S)
{
if(!S->base)
return ERROR;
if( S->top == S->base)
return TRUE;
else
return FALSE;
}
/* 返回栈的长度 */
int StackLength(SqStack *S)
{
if(!S->base)
return ERROR;
return S->top - S->base;
}
/* 若栈不为空,则用e返回S的栈顶元素,并返回OK,否则返回ERROR */
Status GetTop(SqStack *S, SElemType *e)
{
if(!S->base || S->top == S->base)
return ERROR;
*e = *(S->top-1);
return OK;
}
/* 插入元素e为新的栈顶 */
Status Push(SqStack *S, SElemType e)
{
if( S->top - S->base >= S->stacksize ) { /* 栈满,追加存储空间 */
SElemType * ptr = (SElemType *)realloc( S->base,
(S->stacksize + STACK_INCREMENT)*sizeof(SElemType) );
if(!ptr)
return ERROR;
S->base = ptr;
S->top = S->base + S->stacksize; /* top重新指向新的地址 */
S->stacksize += STACK_INCREMENT;
}
*(S->top) = e;
S->top++;
return OK;
}
/* 若栈不空,则弹出栈顶元素,用e保存返回值 */
Status Pop(SqStack *S,SElemType *e)
{
if(S->top == S->base) /* 栈空了 */
return ERROR;
*e = *(S->top-1);
S->top--;
return OK;
}
/* 从栈顶往下打印栈中的数据 */
void printSqStack(SqStack *S)
{
SElemType * p = S->top;
while (p != S->base) {
printf("%d ",*(p-1));
p--;
}
printf("
");
}
int main()
{
SqStack S;
SqStack * pS = &S;
SElemType e;
// 初始化栈
InitStack(pS);
// push 测试
for(int i=1;i<=110;i++) {
Push(pS,i);
}
// 获取栈长度测试
printf("len %d
",StackLength(pS));
// 弹出栈顶
Pop(pS,&e);
printf("pop %d
",e);
// 打印栈测试
printSqStack(pS);
// 获取栈顶测试
GetTop(pS,&e);
printf("top %d
",e);
// 销毁测试
DestoryStack(pS);
printf("
return 0
");
}