自学内容网 自学内容网

利用c语言详细介绍下栈的实现

    数据结构中,栈是一种线性结构,数据元素遵循后进先出的原则。栈的一端为栈顶,一端为栈底或栈尾,数据只在栈顶端进行操作。新插入数据称为入栈或者压栈,删除数据叫做出栈或者退栈。

一、图文介绍

    我们通过建立一个stack的数据结构进行栈的声明,栈的操作通过具体函数实现。stacksize代表栈的总大小,base指针指向栈底,top指针指向栈顶。

1.1,栈的初始化

    我们初始化栈大小为30,也就是说最大存储元素为30个。

1.2,压栈

    我们依次压入数据3,5,9,1,7五个元素,top指针随着数据压入二变动:

 

1.3,出栈

    我们依次出栈7,1,5三个元素,top指针随着数据出栈而变动,栈内部的数据实际未动,后期压栈会覆盖。

 

二、代码实现

2.1,声明

    我们定义要给t_stack.h头文件,内部进行结构体和方法声明:

 

#ifndef TEST1_T_STACK_H
#define TEST1_T_STACK_H


#define STACK_INIT_SIZE 30
#define STACK_INCREMENT 10


typedef  int status;

typedef struct Stack{
    int *base;
    int *top;
    int stacksize;
}stack;


status initStack(stack *);

status destroyStack(stack *);

status clearStack(stack *);

status stackIsEmpty(stack *);

int stackLength(stack *);

status getTop(stack *,int *);

status push(stack *,int data);

status pop(stack *);

void testStack();



#endif //TEST1_T_STACK_H

2.2,初始化函数

status initStack(stack *sqStack)
{

    sqStack->base = (int *)malloc(STACK_INIT_SIZE*sizeof(int));

    if(!sqStack->base)
    {
        printf("stack init failed!\n");
        exit(0);
    }
    sqStack->top = sqStack->base;
    sqStack->stacksize = STACK_INIT_SIZE;
    return OK;

}

2.3,压栈函数

status push(stack *sqStack, int data)
{
    if(sqStack->top-sqStack->base>=sqStack->stacksize)
    {
        sqStack->base = (int *)realloc(sqStack->base,(sqStack->stacksize+STACK_INCREMENT)*sizeof(int));
        if(!sqStack->base)
        {
            printf("stack reallocate failed!\n");
            exit(0);
        }
        sqStack->top = sqStack->base+sqStack->stacksize;
        sqStack->stacksize +=STACK_INCREMENT;
    }
    *sqStack->top ++ = data;
    return OK;
}

2.4,出栈函数

status pop(stack *sqStack)
{
    if(sqStack->base == sqStack->top)
    {
        return ERROR;
    }
    --sqStack->top;
    return OK;
}

2.5,取栈顶元素函数

status getTop(stack *sqStack,int *data )
{
    if(sqStack->base==sqStack->top)
        return ERROR;
    *data = *(sqStack->top-1);
    return OK;

}

2.6,销毁函数

status destroyStack(stack *sqStack)
{
    free(sqStack);
    return OK;
}

2.7,其他

status stackIsEmpty(stack *sqStack)
{
    if(sqStack->base == sqStack->top)
    {
        return OK;
    }
    return ERROR;
}


int stackLength(stack *sqStack)
{
    return sqStack->top-sqStack->base;
}


status clearStack(stack *sqStack)
{
    sqStack->top = sqStack->base;
    return OK;
}

 

三、测试

我们定义一个测试函数,进行测试:

void testStack()
{
    stack *s = (stack *)malloc(sizeof(struct Stack));
    int result = initStack(s);
    push(s,3);
    push(s,9);
    push(s,5);
    push(s,1);
    push(s,7);

    int data;
    getTop(s,data);
    printf("the top data is:%d\n",data);
    pop(s);
    getTop(s,data);
    printf("the top data is:%d\n",data);
    pop(s);
    getTop(s,data);
    printf("the top data is:%d\n",data);
    pop(s);
    getTop(s,data);
    printf("the top data is:%d\n",data);
    pop(s);
    getTop(s,data);
    printf("the top data is:%d\n",data);
    destroyStack(s);
}

    测试结果如下:


原文地址:https://blog.csdn.net/tpc4289/article/details/144031764

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!