当前位置: 首页 > article >正文

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

一、概念与结构

:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出 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自行测试,这里不予提供。


http://www.kler.cn/a/519231.html

相关文章:

  • 单片机基础模块学习——数码管(二)
  • 安宝特方案 | AR在供应链管理中的应用:提升效率与透明度
  • SQL 指南
  • 【2024年华为OD机试】(A卷,200分)- 创建二叉树 (JavaScriptJava PythonC/C++)
  • vscode如何安装vue语法支持
  • CLion开发Qt桌面
  • C语言程序设计十大排序—希尔排序
  • 代码随想录-训练营-day14
  • 设计模式Python版 工厂方法模式
  • 【C语言】字符函数与字符串函数
  • 探寻 UTF - 8 和 GBK 的编码 “黑匣子”
  • 关注搜索引擎蜘蛛压力
  • vim 中粘贴内容时提示: -- (insert) VISUAL --
  • 【YOLOv11改进- 主干网络】YOLOv11+MobileNetV2(2018): 相比于 MobileNetV1 而言准确率更高,模型更小;
  • 【Linux】列出所有连接的 WiFi 网络的密码
  • 《Kotlin核心编程》下篇
  • 安装环境pytorch
  • centos7 配置国内镜像源安装 docker
  • 【分布式日志篇】从工具选型到实战部署:全面解析日志采集与管理路径
  • 使用 Pipeline 提高 Redis 批量操作性能
  • Java 反射机制:春招面试中的关键知识点
  • 【模型】RNN模型详解
  • w178智能学习平台系统设计与实现
  • 景联文科技加入AIIA联盟数据标注分委会
  • Linux的常用指令的用法
  • java定时任务备份数据库