【数据结构】数据结构C语言的实现(栈)

来源:互联网 发布:程序员对浏览器的 编辑:程序博客网 时间:2024/05/01 11:38

/* * 栈 */#include <stdio.h>#include <stdlib.h>#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -2#define INIT_SIZE 20#define INCREMENT_SIZE 5typedef int SElemType;typedef int Status;typedef struct{    SElemType *base;    // 栈底指针 指向栈底元素    SElemType *top;     // 栈顶指针 指向栈顶元素的下一个位置    int size;           // 栈的大小} SqStack;// 初始化栈Status InitStack(SqStack *S){    S->base = (SElemType *)malloc(INIT_SIZE * sizeof(SElemType));    if (!S->base)        exit(OVERFLOW);    S->top = S->base;    S->size = INIT_SIZE;    return OK;}// 销毁栈Status DestroyStack(SqStack *S){    free(S->base);    S->base = NULL;    S->top = NULL;    S->size = 0;    return OK;}// 清空栈Status ClearStack(SqStack *S){    S->top = S->base;    return OK;}// 判断栈是否为空Status IsEmpty(SqStack S){    if (S.top == S.base)        return TRUE;    else        return FALSE;}// 获取栈的长度int GetLength(SqStack S){    return S.top - S.base;}// 返回栈顶Status GetTop(SqStack S, SElemType *e){    if (S.top > S.base)    {        *e = *(--S.top);        return OK;    }    else    {        return ERROR;    }}// pushStatus Push(SqStack *S, SElemType e){    if ((S->top - S->base) / sizeof(SElemType) >= S->size)    {        S->base = (SElemType *)realloc(S->base, (S->size + INCREMENT_SIZE) * sizeof(SElemType));        if (!S->base)            exit(ERROR);        S->top = S->base + S->size;        S->size += INCREMENT_SIZE;    }    *S->top = e;    S->top++;    return OK;}// popStatus Pop(SqStack *S, SElemType *e){    if (S->top == S->base)        return ERROR;    S->top--;    *e = *S->top;    return OK;}// 访问元素void visit(SElemType e){    printf("%d ", e);}// 遍历栈Status TraverseStack(SqStack S, void (*visit)(SElemType)){    while (S.top > S.base)    {        visit(*S.base);        S.base++;    }    printf("\n");    return OK;}/* * 主函数测试 */int main(){    SqStack S;    if (InitStack(&S))    {        SElemType e;        int i;        printf("init_success\n");        if (IsEmpty(S))            printf("Stack is empty\n");        for (i = 0; i < 10; i++)            Push(&S, i);        GetTop(S, &e);        printf("The first element is %d\n", e);        printf("length is %d\n", GetLength(S));        Pop(&S, &e);        printf("Pop element is %d\n", e);        TraverseStack(S, *visit);        Push(&S, 10);        printf("Push element is %d\n", 10);        TraverseStack(S, *visit);        if (DestroyStack(&S))            printf("\ndestroy_success\n");    }}
init_successStack is emptyThe first element is 9length is 10Pop element is 90 1 2 3 4 5 6 7 8 Push element is 100 1 2 3 4 5 6 7 8 10 destroy_success
0 0
原创粉丝点击