栈和队列——c语言实现栈

本节复习栈和队列中栈的增删查改。 

首先回顾一下栈的性质: 栈的存储数据的原则是“后入先出”, 先入的在栈底, 后入的在栈顶。 弹出数据时在栈顶弹出。

开始实现栈的接口

栈的所有函数接口

//栈的初始化
void StackInit(Stack* pst);

//入栈
void StackPush(Stack* pst, STDataType x);
//出栈
void StackPop(Stack* pst);
//获取栈顶元素
STDataType StackTop(Stack* pst);
//获取栈中有效元素的个数
int StackSize(Stack* pst);
//检测栈是否为空
bool StackEmpty(Stack* pst);
//销毁栈
void StackDestroy(Stack* pst);

-----------------------------------------------------------------------------------------------------------------------------------------

准备文件

先准备三个文件, 一个main.c, 一个.h文件用于声明函数接口, 还有一个.c文件用于实现函数接口

 ---------------------------------------------------------------------------------------------------------------------------------------

创建栈的结构体蓝图

首先包含一下头文件。重定义一下要保存的数据类型。 这样做是为了后续便于维护我们的栈。

 

然后再创建栈的结构体。 栈的结构体成员有三个, 一个指向动态开辟内存的指针(动态栈,更优)。第一个是栈的数据个数, 我们用top来表示。 第三个就是栈的总容量, 这个总容量不是固定的, 动态栈在后续空间不够还会开辟新的空间。 

 ---------------------------------------------------------------------------------------------------------------------------------------

栈的初始化 

创建好栈后第一步就是将栈进行初始化。

.h函数声明

.c函数实现

 --------------------------------------------------------------------------------------------------------------------------------------- 

入栈

入栈时要确保栈有空间, 如果没有空间, 那么就需要开辟空间, 一般我们扩容的原则和顺序表示一样的。 就是扩容位原来的二倍大小的空间。

.h函数声明

.c函数实现

 ---------------------------------------------------------------------------------------------------------------------------------------

 出栈

出栈要确保栈中有元素, 并且注意出栈元素应该为最后入栈的那个元素, 也就是data中下表为top - 1的元素。 出栈并不是要将top - 1处的元素拿走,而是让top 减去1, 对于栈来说, top 减去1, 就意味着少了一个元素。 这个元素就是栈顶的元素。 

.h函数声明:

.c函数实现:

 ---------------------------------------------------------------------------------------------------------------------------------------

获取栈顶元素

栈顶元素就是top - 1位置的元素。 

.h函数声明

.c函数实现

 ---------------------------------------------------------------------------------------------------------------------------------------

 获取栈中有效元素的个数

栈的元素个数其实就是top的大小, 但是c语言推荐使用函数来获取栈的元素个数。 

.h函数声明

 .c函数实现

 ---------------------------------------------------------------------------------------------------------------------------------------

检测栈是否为空 

top == 0的时候,栈就是空的。

这里忘记包含bool函数的头文件了。 包含一下头文件。

.h函数声明

.c函数实现

 ---------------------------------------------------------------------------------------------------------------------------------------

销毁栈 

销毁栈的意思是销毁栈的data所指向的动态开辟的空间。 而不是销毁我们用结构体定义的栈的这个变量本身。 这个变量本身只是一个在栈帧空间开辟出来的结构体变量。 只有在堆区用动态开辟开辟出来的内存才需要销毁

.h函数声明

.c函数实现

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Monkey测试必现ANR问题分析与解决

AAA项目Monkey测试必现ANR问题分析 【摘要】ANR(Application Not responding),是指应用程序未响应,Android系统对于一些事件需要在一定的时间范围内完成,如果超过预定时间能未能得到有效响应或者响应时间过长,比如输入事件5s内未…

大模型日报|今日必读的7篇大模型论文

大家好,今日必读的大模型论文来啦! 1.Sora综述:大型视觉模型的背景、技术、局限和机遇 Sora 是 OpenAI 于 2024 年 2 月发布的文生视频人工智能(AI)模型。经过训练,Sora 能根据文字说明生成逼真或富有想象…

2.27数据结构

1.链队 //link_que.c #include "link_que.h"//创建链队 Q_p create_que() {Q_p q (Q_p)malloc(sizeof(Q));if(qNULL){printf("空间申请失败\n");return NULL;}node_p L(node_p)malloc(sizeof(node));if(LNULL){printf("申请空间失败\n");return…

一周学会Django5 Python Web开发-Django5列表视图ListView

锋哥原创的Python Web开发 Django5视频教程: 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计27条视频,包括:2024版 Django5 Python we…

Java毕业设计-基于springboot开发的冬奥会科普平台系统-毕业论文+PPT(有源代码)

文章目录 前言一、毕设成果演示(源代码在文末)二、毕设摘要展示1.开发说明2.需求分析3、系统功能结构 三、系统实现展示1、登录注册2、系统功能模块3、管理员功能模块 四、毕设内容和源代码获取总结 Java毕业设计-基于springboot开发的冬奥会科普平台系统…

CrossOver2024软件虚拟机下载及使用方法教程步骤

CrossOver的使用方法相对简单,以下是详细的步骤: 下载与安装:首先,您需要从CrossOver的官方网站下载适合您操作系统(Mac OS或Linux)的软件版本。下载完成后,解压文件并按照提示进行安装。安装过…

强大的Docker入门知识

目录 一、Docker简介 1.1、Docker是 1.2、Docker通常会在以下情况下使用: 1.3、Docker和VMware区别 1.4、Docker 的优点 二、环境配置 2.1、代码操作 2.2、效果演示 2.3、配置镜像仓库 开始配置 三、基本命令 3.1、Docker基本命令 3.2、Docker镜像常用…

高并发数据采集:Ebay商家信息多进程爬虫的进阶实践

背景 Ebay作为全球最大的电子商务平台之一,其商家信息包含丰富的市场洞察。然而,要高效获取这些信息,就需要利用先进的技术手段。本文将深入探讨如何通过并发加速技术,实现Ebay商家信息多进程爬虫的最佳实践方法,并附…

分布式存储 ZBS 的 RoCE 技术支持与大数据应用场景性能评测

作者:深耕行业的 SmartX 金融团队 闫海涛 在《解决 SAN 交换机“卡脖子”并升级存储架构?一文解析 RoCE 与相关存储方案趋势》文章中,我们分析了如何利用支持 RoCE 技术的分布式存储,同步实现 IT 基础架构的信创转型与架构升级&a…

Linux中 LVM 逻辑盘卷管理

CSDN 成就一亿技术人! 作者主页:点击! Linux专栏:点击! CSDN 成就一亿技术人! 前言———— LVM 代表逻辑卷管理器,它是一种用于 Linux 和类 Unix 操作系统的磁盘管理和存储技术。LVM 允许用…

Linux终端中的VI/VIM编辑器详细说明

vi/vim —— 终端中的编辑器 目标 vi/vim 简介打开和新建文件三种工作模式常用命令分屏命令常用命令速查图 01. vi 简介 vi 或 vim 是一个强大的文本编辑器,它最初是由 vi 的作者布莱姆米勒开发的,后来由吉多范罗苏姆及其团队进行了扩展和维护&#…

opencascade c#例程解析

1.编译 将msvc.bat文件拖入vs2022的x64 native tools&#xff0c;即可 2.about.xaml <Windowxmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"x:Class"IE_WPF_WinForms…

Linux之定时任务02

一、什么是crond Linux 中 crond 就是定时任务&#xff0c;即根据 crond 指定的时间&#xff0c;由系统按指定的时间&#xff0c;周期性&#xff0c;自动触发的事件。 crond 服务在默认的情况下会每分钟检查系统中是否有定时任务&#xff0c;如果有且符合触发条件&#xff0c;…

docker 容器修改端口和目录映射

一、容器修改端口映射 一般在运行容器时&#xff0c;我们都会通过参数 -p&#xff08;使用大写的-P参数则会随机选择宿主机的一个端口进行映射&#xff09;来指定宿主机和容器端口的映射&#xff0c;例如 docker run -it -d --name [container-name] -p 8088:80 [image-name]…

Vue3之属性传值的四种情况

文章目录 Vue3之属性传值的四种情况一、引言二、父组件向子组件传值三、子组件向父组件传值四、祖先组件向后代组件传值五、兄弟组件之间传值 Vue3之属性传值的四种情况 一、引言 在vue3中&#xff0c;组件与组件之间是可以传递属性的&#xff0c;包括三种类型&#xff1a; …

Java Stream流指南:优雅处理集合数据

文章目录 一、为什么要使用stream流呢&#xff1f;二、如何获取Stream流&#xff1f;三、Stream流的中间方法四、Stream流的终结方法总结 一、为什么要使用stream流呢&#xff1f; 想必我们在日常编程中&#xff0c;会经常进行数据的处理&#xff0c;我们先来看看没有stram流时…

从零开始学习Netty - 学习笔记 -Netty入门-ChannelFuture

5.2.2.Channel Channel 的基本概念 在 Netty 中&#xff0c;Channel 是表示网络传输的开放连接的抽象。它提供了对不同种类网络传输的统一视图&#xff0c;比如 TCP 和 UDP。 Channel 的生命周期 Channel 的生命周期包括创建、激活、连接、读取、写入和关闭等阶段。Netty 中…

CGI程序与ShellShock漏洞

CGI是什么&#xff1f; CGI&#xff08;通用网关接口&#xff0c;Common Gateway Interface&#xff09;程序是一种用于在Web服务器上执行动态内容的技术。与服务器上普通的后端代码相比&#xff0c;CGI程序有几个区别&#xff1a; 执行环境&#xff1a; CGI程序在服务器上作为…

js中Symbol的理解与应用

文章目录 一、Symbol特性1.1 不支持语法new Symbol()1.2 唯一性1.3 不与其他值隐式转换1.4 不可枚举1.5 类型为symbol 二、Symbol常见方法2.1 Symbol.toStringTag2.2 Symbol.iterator2.3 Symbol.for() 三、Symbol应用 在JavaScript中&#xff0c;Symbol 是一种基本数据类型&…

el-table 多选表格存在分页,编辑再次操作勾选会丢失原来选中的数据

el-table表格多选时&#xff0c;只需要添加type"selection"&#xff0c; row-key及selection-change&#xff0c;如果存在分页时需要加上reserve-selection&#xff0c;这里就不写具体的实现方法了&#xff0c;可以查看我之前的文章&#xff0c;这篇文章主要说一下存…