欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 名人名企 > 数据结构初阶之栈的介绍与栈的实现

数据结构初阶之栈的介绍与栈的实现

2025/2/8 14:32:38 来源:https://blog.csdn.net/2401_86861045/article/details/145355682  浏览:    关键词:数据结构初阶之栈的介绍与栈的实现

一、概念与结构

:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出 LIFO(Last In First Out)的原则。
压栈:栈的插入操作叫做进栈 / 压栈 / 入栈,入数据在栈顶
出栈:栈的删除操作叫做出栈。出数据也在栈顶

二、栈的实现

项目创建的时候,要创建一个头文件(.h)Stack.h ,两个源文件(.c)Stack.c ,test.c 。Stack.h 用于定义结构体和声明函数;Stack.c 用于实现函数;test.c 用于测试函数,每实现一个函数要进行相应的测试。编写代码过程中要勤测试,避免写出大量代码后再测试,如果出现问题,问题无从定位。

1、Stack.h

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>

//定义栈的结构
typedef int DataType;
typedef struct Stack
{
    DataType* arr;
    int top;
    int capacity;
}Stack;

//初始化栈
void Init_Stack(Stack* st);

//销毁栈
void Destory_Stack(Stack* st);

//判断栈是否为空
bool Empty_Stack(Stack* st);

//入栈
void Push_Stack(Stack* st, DataType x);

//出栈
void Pop_Stack(Stack* st);

//取栈顶数据
DataType Get_Top_Stack(Stack* st);

//获取栈中的有效元素的个数
int Count_Stack(Stack* st);

2、Stack.c

#include"Stack.h"

//初始化栈
void Init_Stack(Stack* st)
{
    st->arr = NULL;
    st->top = st->capacity = 0;
}

//销毁栈
void Destory_Stack(Stack* st)
{
    if (st->arr)
        free(st->arr);
    st->arr = NULL;
    st->top = st->capacity = 0;
}

//判断栈是否为空
bool Empty_Stack(Stack* st)
{
    assert(st);
    return st->top != 0;
}
//入栈
void Push_Stack(Stack* st, DataType x)
{
    assert(st);
    if (st->top == st->capacity)
    {
        int newcapacity = st->capacity ? 2 * st->capacity : 4;
        DataType* tmp = (DataType*)realloc(st->arr, newcapacity * sizeof(DataType));
        if (!tmp)
        {
            perror("realloc fail!");
            exit(1);
        }
        st->arr = tmp;
        st->capacity = newcapacity;
    }
    st->arr[st->top++] = x;
}

//出栈
void Pop_Stack(Stack* st)
{
    assert(Empty_Stack(st));
    st->top--;
}

//取栈顶数据
DataType Get_Top_Stack(Stack* st)
{
    assert(Empty_Stack(st));
    return st->arr[st->top - 1];

}

//获取栈中的有效元素的个数
int Count_Stack(Stack* st)
{
    assert(st);
    return st->top;
}

test.c自行测试,这里不予提供。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com