Bootstrap

C语言:顺序栈的实现(详细代码注解)

完整代码:

#include <stdio.h>
#include <stdlib.h>
//函数结果状态代码
#define TRUE         1
#define FALSE        0
#define OK           1
#define ERROR        0
#define INFEASIBLE  -1
#define OVERFLOW    -2

//给int定义别名为status,当函数返回值是为状态码时,可用status作为函数类型,更方便理解
typedef int Status;

//顺序栈存储空间的初始分配量
#define StackInitSize    10
//顺序栈存储空间每次增加的分配量
#define StackAddSize     10

//定义顺序栈的结构体
typedef struct
{
    int *base;//在栈构造之前和销毁之后,base的值为NULL
    int *top;//栈顶指针
    int StackSize;//当前已分配的存储空间
}SqStack;

//初始化一个空顺序栈 
Status InitStack(SqStack *S);

//销毁一个顺序栈 
Status DestroyStack(SqStack *S);

//清空顺序栈
Status ClearStack(SqStack *S);

//判断顺序栈是否为空
Status EmptyStack(SqStack S);

//判断顺序栈是否已满
Status FullStack(SqStack S);

//求当前顺序栈的长度
int Length(SqStack S);

//插入元素e为新的栈顶元素
Status Push(SqStack *S,int e);

//删除栈顶元素,并用e返回
Status Pop(SqStack *S,int *e);

//获取栈顶元素,并用e返回
Status GetTop(SqStack S,int *e);

//打印顺序栈的元素
void PrintfStack(SqStack S);


int main(){
    SqStack S;
    InitStack(&S);
    Push(&S,1);
    Push(&S,2);
    Push(&S,3);
    Push(&S,4);
    Push(&S,5);
    Push(&S,6);
    Push(&S,7);
    Push(&S,8);
    Push(&S,9);
    Push(&S,10);
    Push(&S,11);
    int a;
    GetTop(S,&a);
    printf("此时栈顶的元素为%d\n",a);
    printf("%d\n",FullStack(S));
    printf("%d\n",EmptyStack(S));
    PrintfStack(S);
    int e;
    Pop(&S,&e);
    printf("删除的元素为%d\n",e);
    GetTop(S,&a);
    printf("此时栈顶的元素为%d\n",a);
    printf("%d\n",Length(S));
    DestroyStack(&S);
}


//初始化一个空顺序栈 
Status InitStack(SqStack *S){
    //构造一个新的栈
    S->base=(int *)malloc(StackInitSize*(sizeof(int)));//动态分配数组空间
    if(!S->base) exit(OVERFLOW);//存储空间分配失败
    S->top=S->base;//此时为空栈
    S->StackSize=StackInitSize;//初始化后最大容量为StackInitSize
    return OK;
}
//销毁一个顺序栈 
Status DestroyStack(SqStack *S){
    if (S==NULL) exit(OVERFLOW);
    free(S->base);//释放动态开辟的空间
    //将S的属性全部置空
    S->base=NULL;
    S->top=NULL;
    S->StackSize=0;
    return OK;
}
//清空顺序栈
Status ClearStack(SqStack *S){
    //清空栈的的前提是栈要存在
    if (!S->base) exit(OVERFLOW);
    //只需将顺序栈的top指针指向base指针即可清空
    S->top=S->base;
    return OK;
}
//判断顺序栈是否为空
Status EmptyStack(SqStack S){
    //只需判断顺序栈的top指针是否指向base指针
    if (S.base==S.top) return TRUE;
    return FALSE;
}
//判断顺序栈是否已满
Status FullStack(SqStack S){
    return S.top-S.base>=S.StackSize;
}
//求当前顺序栈的长度
int Length(SqStack S){
    return S.top-S.base;
}
//插入元素e为新的栈顶元素
Status Push(SqStack *S,int e){
    if (S->top-S->base>=S->StackSize)
    {
        S->base=(int *)realloc(S->base,(S->StackSize+StackAddSize)*sizeof(int));
        if(!S->base) exit(OVERFLOW);//存储空间分配失败
        S->top=S->base+S->StackSize;//此时top指针在新分配的存储空间的StackSize位置上
        S->StackSize+=StackAddSize;
    }
    *(S->top)=e;
    S->top++;
    return OK;
}
//删除栈顶元素,并用e返回
Status Pop(SqStack *S,int *e){
    //判断栈是否为空
    if (S->top==S->base)
    {
        printf("此栈为空\n");
        return ERROR;
    }
    S->top--;//先自减,到达删除元素的位置
    *e=*(S->top);
    return OK;
}
//获取栈顶元素,并用e返回
Status GetTop(SqStack S,int *e){
    //判断栈是否为空
    if (S.top==S.base)
    {
        printf("此栈为空\n");
        return ERROR;
    }
    *e=*(S.top-1);
    return OK;
}
//打印顺序栈的元素
void PrintfStack(SqStack S){
    if (EmptyStack(S))
    {
        printf("此栈为空,不能读取\n");
        exit(OVERFLOW);
    }
    int *p = S.top - 1;
    printf("栈顶\n");
    while (p >= S.base) {
        printf("%d\n", *p);
        p--;
    }
    printf("栈底\n");
}

运行截图:

 

;