探索栈数据结构:深入了解其实用与实现(c语言实现栈)

上次结束了链表部分的内容:链接未来:深入理解链表数据结构(二.c语言实现带头双向循环链表)

然而,当我们涉及特定问题时,另一个非常有用的数据结构也开始显得至关重要——栈

栈与链表有着截然不同的特性,它采用一种后进先出(LIFO)的策略,这意味着最后进入栈的元素将首先被取出。这样的特性赋予了栈在特定场景下独特的价值和功能
源码可以去我的gitee:Nero的gitee


文章目录

  • 1.栈的概念和结构
  • 2.栈的实现
    • 2.1项目文件规划
    • 2.2基本结构及各功能(Stack.h)
    • 2.3各功能具体实现
      • 初始化
      • 插入
      • 删除
      • 返回栈顶元素
      • 是否为空
      • 元素数量


1.栈的概念和结构

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

压栈(push):栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶

出栈(pop):栈的删除操作叫做出栈。出数据也在栈顶

请添加图片描述


2.栈的实现

栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。栈只在一端进行插入和删除,选择数组尾端非常契合。

2.1项目文件规划

请添加图片描述

    • 头文件Stack.h:用来基础准备(常量定义,typedef),链表表的基本框架,函数的声明
    • 源文件Stack.h:用来各种功能函数的具体实现
    • 源文件test.c:用来测试功能是否有问题,进行基本功能的使用

2.2基本结构及各功能(Stack.h)

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>typedef int STDataType;typedef struct Stack
{int* a;int top;		// 标识栈顶位置的int capacity;   //栈的容量
}ST;void STInit(ST* ps);//初始化
void STDestroy(ST* ps);//销毁void STPush(ST* ps, STDataType x);// 栈顶插入
void STPop(ST* ps);// 栈顶删除STDataType STTop(ST* ps);//返回栈顶元素bool STEmpty(ST* ps);//判断栈是否为空int STSize(ST* ps);//栈中元素数量

2.3各功能具体实现

初始化

void STInit(ST* ps)
{assert(ps);ps->a = NULL;ps->top = -1;//我选择了-1ps->capacity = 0;
}

top用来标记栈顶位置,那一开始初始化为多少合适:

  1. 初始化为**-1**:指向塔顶元素。因为底层用数组来实现,那第一个元素下标为0,一开始无元素为-1,有了第一个元素加上1变成0,完全符合。
  2. 初始化为0指向塔顶元素的下一个位置。道理同上,但是总是比塔顶元素下标大1

插入

void STPush(ST* ps, STDataType x)
{assert(ps);if (ps->capacity == ps->top + 1)//判断有没有满{int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;STDataType* new = (STDataType*)realloc(ps->a, sizeof(ST) * newCapacity);assert(new);ps->a = new;ps->capacity = newCapacity;}ps->top++;ps->a[ps->top] = x;
}
  1. 代码确保传入的栈指针 ps 是有效的。然后,它检查栈是否已满。当栈满时,需要扩展栈的容量

  2. 栈的 top 指针增加,表示栈顶位置上移一个单位。最后,要推入栈的元素 x 被放入栈顶位置

    ps->a[ps->top]

删除

void STPop(ST* ps)
{assert(ps);assert(ps->top >= 0);//确保不为空ps->top--;
}

返回栈顶元素

STDataType STTop(ST* ps)
{assert(ps);assert(ps->top >= 0);return ps->a[ps->top];
}

是否为空

bool STEmpty(ST* ps)
{assert(ps);return ps->top == -1;
}

元素数量

int STSize(ST* ps)
{assert(ps);return ps->top + 1;
}

大家一般都是:栈和队列,栈和队列,(二者放在一起)马上就到队列的知识梳理了。
感谢大家支持!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/295121.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用友U8CRM系统help2 任意文件读取漏洞复现

用友U8CRM系统的help2文件中接口存在任意文件读取漏洞&#xff0c;攻击者在未登录情况下即可进行漏洞利用。 1.1 漏洞级别 高危 1.2 快速检索 fofa语法&#xff1a; title"用友U8CRM"1.3 漏洞复现 该漏洞利用非常简单&#xff0c;只需构造get请求 访问该地址即可…

STL中优先队列的模拟实现与仿函数的介绍

文章目录 仿函数优先队列的模拟实现 仿函数 上回我们说到&#xff0c;优先队列的实现需要用到仿函数的特性 让我们再回到这里 这里我们发现他传入的用于比较的东西竟然是一个类模板&#xff0c;而不是我们所见到的函数 我们可以先创建一个类&#xff0c;用于比较大小 struc…

使用Velero备份、恢复k8s集群上的资源

一、Velero简介 Velero提供备份和恢复 Kubernetes 集群资源和持久卷的工具。 Velero功能&#xff1a; 对群集进行备份&#xff0c;并在丢失时进行还原。将集群资源迁移到其他集群。 Velero 包括&#xff1a; 在群集上运行的服务器在本地运行的命令行客户端 开源地址&…

【MySQL】MySQL的数据类型

MySQL的数据类型 一、数据类型分类二、数值类型1、整数类型2、bit类型3、小数类型 三、字符串类型四、时间日期类型五、enum和set类型enum和set查找 数据类型的作用&#xff1a; 决定了存储数据时应该开辟的空间大小和数据的取值范围。决定了如何识别一个特定的二进制序列。 …

【自营版】物流系统+取件员收件员/运营级快递系统小程序源码

后端php前端原生小程序 mysql数据库 主要功能&#xff1a; 寄快递 查快递 多门店 市内取送 取件员中心在线接单 提前预约 也可 立即下单 门店入住 取件员入住

需求分析工程师岗位的职责描述(合集)

需求分析工程师岗位的职责描述1 职责&#xff1a; 1&#xff0c;负责需求调研&#xff0c;对需求进行分析&#xff0c;编写解决方案、需求规格说明书等 2&#xff0c;根据需求制作原型&#xff0c;并负责原型展示以及客户沟通等工作 3&#xff0c;负责向技术团队精确地传达业务…

python算法例23 落单的数Ⅰ

1. 问题描述 给出2n1个非负整数元素的数组&#xff0c;除其中一个数字之外&#xff0c;其他每个数字均出现两次&#xff0c;找到这个数字。 2. 问题示例 给出[1&#xff0c;2&#xff0c;2&#xff0c;1&#xff0c;3&#xff0c;4&#xff0c;3]&#xff0c;返回4。 3. 代…

Jenkins 插件管理指南

目录 常用插件 插件安装 已安装插件 installed plugins 常用插件 Docker Plugin&#xff1a; 这个插件让Jenkins能够与Docker容器平台进行集成。它允许在Jenkins构建过程中创建、管理和销毁Docker容器&#xff0c;为需要Docker化的项目提供了极大的便利性。对于需要在容器中…

2024年【安全生产监管人员】模拟考试题库及安全生产监管人员理论考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全生产监管人员模拟考试题库是安全生产模拟考试一点通总题库中生成的一套安全生产监管人员理论考试&#xff0c;安全生产模拟考试一点通上安全生产监管人员作业手机同步练习。2024年【安全生产监管人员】模拟考试题…

php反序列化漏洞原理、利用方法、危害

文章目录 PHP反序列化漏洞1. 什么是PHP反序列化漏洞&#xff1f;2. PHP反序列化如何工作&#xff1f;3. PHP反序列化漏洞是如何利用的&#xff1f;4. PHP反序列化漏洞的危害是什么&#xff1f;5. 如何防止PHP反序列化漏洞&#xff1f;6. PHP反序列化漏洞示例常见例子利用方法PH…

Ubuntu 常用命令之 mkfs 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 mkfs 是在 Linux 和其他 Unix-like 系统中用于创建文件系统的命令。在 Ubuntu 系统中&#xff0c;mkfs 命令也是用于创建文件系统的。mkfs 是一个包装器&#xff0c;它会根据用户指定的文件系统类型调用相应的程序。 mkfs 命令的…

宝塔面板 -- 创建第一个自己的网站

文章目录 前言 一、安装宝塔面板 二、注册宝塔面板 三、安装nginx 四、第一个hello world运行 五、总结 文章目录 前言一、安装宝塔面板二、注册宝塔面板三、安装nginx四、第一个hello world运行五、总结 前言 阿里云最近对在校大学生免费每人赠送一台服务器&#xff0c…