栈详解(C语言)

文章目录

  • 写在前面
  • 1 栈的定义
  • 2 栈的初始化
  • 3 数据入栈
  • 4 数据出栈
  • 5 获取栈顶元素
  • 6 获取栈元素个数
  • 7 判断栈是否为空
  • 8 栈的销毁

写在前面

本片文章详细介绍了另外两种存储逻辑关系为 “一对一” 的数据结构——栈和队列中的栈,并使用C语言实现了数组栈。
栈C语言实现源码:栈源码
以栈在存储数据时具有特殊的顺序规则:
:使用栈结构存储数据,遵循“**先进后出”**的原则,即最先进栈的数据最后出栈。栈可以分为顺序栈(基于数组实现)和链栈(基于链表实现)。
在这里插入图片描述

栈的实现方式分为顺序和链式结构,分别适用于不同的场景。顺序结构在内存中占据一块连续的空间,而链式结构通过节点之间的指针连接。这使得栈和队列在实际应用中更灵活,可以根据具体需求选择不同的实现方式。

1 栈的定义

栈结构的定义通常包括一个动态开辟的数组,用来存储数据,一个用于记录栈顶位置以及一个用于记录栈容量的变量。下面是栈结构的定义:

typedef int STDataType;//数组栈
typedef struct Stack
{STDataType* nums;//动态开辟的数组int top;//栈顶位置int capacity;//栈容量
}Stack;

2 栈的初始化

刚开始栈是一个空栈,因此需要将栈的元素数组指针 nums 初始化为 NULL,表示栈中当前没有元素。capacity 表示栈的容量,初始时为0,表示栈中没有元素。而将top 初始化为0,表示top指向栈顶元素的下一个位置
代码如下:

void StackInit(Stack* pst)
{assert(pst);//检查参数有效性pst->nums = NULL;pst->top = pst->capacity = 0;//top初始化为0,说明top指向栈顶元素的下一个位置
}

3 数据入栈

数据入栈的操作:

  1. 检查栈是否已满,如果满了要进行扩容操作。
  2. 根据上面栈的初始化操作,我们知道,top是指向栈顶元素的下一个位置,因此,数据入栈时,只需将数据放在top指向的位置,再将top向后移动一个位置即可。

图解如下:
在这里插入图片描述
代码如下:

void StackPush(Stack* pst, STDataType x)
{assert(pst); //检查参数有效性//检查是否需要扩容if (pst->top == pst->capacity){int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;STDataType* tmp = (STDataType*)realloc(pst->nums, sizeof(STDataType) * newcapacity);if (tmp == NULL){perror("StackPush->malloc");exit(-1);}pst->nums = tmp;pst->capacity = newcapacity;}//元素入栈pst->nums[pst->top++] = x;
}

4 数据出栈

我们知道,栈只能在栈顶一端出入数据,出数据时只能出栈顶的数据。
数据出栈的步骤如下:

  1. 在执行出栈操作之前,需要检查栈是否为空。如果栈为空(即没有数据),则无法执行出栈操作,因为没有数据可以出栈。
  2. 如果栈不为空,即存在数据,就可以执行出栈操作。调整栈顶指针 top,通过将 top 向前移动一个位置,实现了出栈操作(这里是数组栈,top指向栈顶元素的下一个位置)。

图解如下:
在这里插入图片描述

代码如下:

void StackPop(Stack* pst)
{assert(pst);//检查参数有效性assert(!StackEmpty(pst));//为空不能进行删除//元素出栈pst->top--;
}

5 获取栈顶元素

取栈顶元素的步骤如下:

  1. 在执行取栈顶元素操作之前,需要检查栈是否为空。如果栈为空(即没有数据),则无法执行此操作。
  2. top指向栈顶元素的下一个位置,如要获取栈顶元素,因此只需返回top-1位置的元素即可。
    在这里插入图片描述

代码如下:

STDataType StackTop(Stack* pst)
{assert(pst);//检查参数有效性assert(!StackEmpty(pst));//为空不能取栈顶元素return pst->nums[pst->top - 1];
}

6 获取栈元素个数

栈的栈顶指针top是指向栈顶元素的下一个位置,同时top的值也是栈元素个数。
在这里插入图片描述
代码如下:

int StackSize(Stack* pst)
{assert(pst);//检查参数有效性return pst->top;
}

7 判断栈是否为空

根据初始化栈的函数我们知道,当栈为空时,栈的栈顶指针top是指向nums数组的0位置。
在这里插入图片描述
代码如下:

bool StackEmpty(Stack* pst)
{assert(pst);//检查参数有效性return pst->top == 0;
}

8 栈的销毁

根据栈结构的定义,我们知道,栈用来存储数据的数组,是动态申请的,因此栈在销毁时需要手动释放动态申请的空间,同时将top和capacity置为0。
代码如下:

void StackDestroy(Stack* pst)
{assert(pst);//检查参数有效性free(pst->nums);pst->nums = NULL;pst->top = pst->capacity = 0;
}

至此,本片文章就结束了,若本篇内容对您有所帮助,请三连点赞,关注,收藏支持下。
创作不易,白嫖不好,各位的支持和认可,就是我创作的最大动力,我们下篇文章见!
如果本篇博客有任何错误,请批评指教,不胜感激 !!!
在这里插入图片描述

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

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

相关文章

【自主探索】基于 rrt_exploration 的单个机器人自主探索建图

文章目录 一、rrt_exploration 介绍1、原理2、主要思想3、拟解决的问题4、优缺点 二、安装环境三、安装与运行1、安装2、运行 四、配置说明1、Robots Network2、Robots frame names in tf3、Robots node and topic names4、Setting up the navigation stack on the robots5、A …

【数据库】执行计划中二元操作对一趟扫描算法的应用,理解代价评估的应用和优化,除了磁盘代价还有CPU计算代价不容忽略

二元操作的一趟算法 ​专栏内容: 手写数据库toadb 本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。 本专栏会定…

C#,《小白学程序》第十九课:随机数(Random)第六,随机生成任意长度的大数(BigInteger)

1 文本格式 using System; using System.Linq; using System.Text; using System.Collections.Generic; /// <summary> /// 大数的&#xff08;加减乘除&#xff09;四则运算、阶乘运算 /// 乘法计算包括小学生算法、Karatsuba和Toom-Cook3算法 /// 除法运算为 Truffer…

Leetcode—167.两数之和 II - 输入有序数组【中等】

2023每日刷题&#xff08;四十一&#xff09; Leetcode—167.两数之和 II - 输入有序数组 实现代码 /*** Note: The returned array must be malloced, assume caller calls free().*/ int* twoSum(int* numbers, int numbersSize, int target, int* returnSize) {*returnSiz…

小程序中的大道理之四--单元测试

在讨论领域模型之前, 先继续说下关于测试方面的内容, 前面为了集中讨论相应主题而对此作了推迟, 下面先补上关于测试方面的. 测试覆盖(Coverage) 先回到之前的一些步骤上, 假设我们现在写好了 getPattern 方法, 而 getLineContent 还处于 TODO 状态, 如下: public String ge…

网络视频播放卡顿原因分析

一、问题描述 某项目通过拉摄像机rtsp流转rtmp/http-flv/ws-flv的方案&#xff0c;使用户可以在网页中观看摄像机的视频画面。在 观看视频时偶发出现卡顿现象。 二、卡顿现象分析和解决 此问题涉及的原因较多&#xff0c;所以得考虑各环节的问题可能性&#xff0c;并根据现场实…

在CentOS 7.9上搭建高性能的FastDFS+Nginx文件服务器集群并实现外部远程访问

文章目录 引言第一部分&#xff1a;FastDFS介绍与安装1.1 FastDFS简介1.2 FastDFS安装1.2.1 安装Tracker Server1.2.2 安装Storage Server 1.3 FastDFS配置1.3.1 配置Tracker Server1.3.2 配置Storage Server1.3.3 启动FastDFS服务 第二部分&#xff1a;Nginx配置2.1 Nginx安装…

Docker容器化部署若依微服务ruoyi-cloud项目

系统环境 接下来的内容以 Ubuntu 22.04.1 操作系统为例。 下载安装Docker Ubuntu hihi-IdeaCentre-GeekPro-15ICK:~$ sudo su [sudo] hi 的密码&#xff1a; roothi-IdeaCentre-GeekPro-15ICK:/home/hi# docker ps 找不到命令 “docker”&#xff0c;但可以通过以下软件包安…

Visual Studio 使用MFC 单文档工程绘制单一颜色直线和绘制渐变颜色的直线(实例分析)

Visual Studio 使用MFC 单文档工程从创建到实现绘制单一颜色直线和绘制渐变颜色的直线 本文主要从零开始创建一个MFC单文档工程然后逐步实现添加按键&#xff08;事件响应函数&#xff09;&#xff0c;最后实现单一颜色直线的绘制与渐变色直线的绘制o(&#xffe3;▽&#xffe…

【云原生】什么是 Kubernetes ?

什么是 Kubernetes &#xff1f; Kubernetes 是一个开源容器编排平台&#xff0c;管理着一系列的 主机 或者 服务器&#xff0c;它们被称作是 节点&#xff08;Node&#xff09;。 每一个节点运行了若干个相互独立的 Pod。 Pod 是 Kubernetes 中可以部署的 最小执行单元&#x…

2、Burp使用

文章目录 一、为Firefox浏览器安装数字证书二、利用Intruder模块进行暴力破解 一、为Firefox浏览器安装数字证书 &#xff08;1&#xff09;利用Firefox浏览器访问http://burp或127.0.0.1:<监听端口>&#xff0c;点击页面右上侧的“CA Certificate”处下载CA证书&#xf…

机器学习---贝叶斯网络与朴素贝叶斯

1. 贝叶斯法则 如何判定一个人是好人还是坏人&#xff1f; 当你无法准确的熟悉一个事物的本质时&#xff0c;你可以依靠与事物特定本质相关的事件出现的次数来判断 其本质属性的概率。如果你看到一个人总是做一些好事&#xff0c;那这个人就越可能是一个好人。 数学语言表达…

float和double(浮点型数据)在内存中的储存方法

作者&#xff1a;元清加油 主页&#xff1a;主页 编译环境&#xff1a;visual studio 2022 (x86) 相信大家都知道数据在内存中是以二进制储存的 整数的储存方法是首位是符号位&#xff0c;后面便是数值位 那么浮点数在内存中是怎么储存的呢&#xff1f;我们先来看一个例子&am…

Android WiFi的断开分析

1.wifi断开大体流程&#xff1a; 1.wifi断开 wlan-driver最先知道。 2.wlan-driver在与路由器连接的时候(未断开时), 会有周期性的beacon帧来维持连接&#xff0c;AP端一旦遇到突发事情&#xff0c;会立刻通过802.11协议的 deauth 帧/ reject 帧等 通知到 driver。 3. wlan-…

【Java程序员面试专栏 专业技能篇 】Java SE核心面试指引(四):Java新特性

关于Java SE部分的核心知识进行一网打尽,包括四部分:基础知识考察、面向对象思想、核心机制策略、Java新特性,通过一篇文章串联面试重点,并且帮助加强日常基础知识的理解,全局思维导图如下所示 本篇Blog为第四部分:Java新特性,子节点表示追问或同级提问 Java8新特性…

【部署运维】docker:入门到进阶

0 前言 部署运维博客系列一共有三篇&#xff1a; 拥抱开源&#xff0c;将工作中的经验分享出来&#xff0c;尽量避免新手踩坑。 【部署运维】docker&#xff1a;入门到进阶 【部署运维】kubernetes&#xff1a;容器集群管理掌握这些就够了 【部署运维】pythonredisceleryd…

快速、精确仿真高频电磁场的工具CST Studio Suite 2024版本下载与安装配置

目录 前言一、CST 2024 安装二、使用配置总结 前言 CST Studio Suite是一个集成的仿真工具套件&#xff0c;用于模拟和优化电子系统的性能。它包括多个工具和模块&#xff0c;如电磁仿真、结构仿真、热仿真、电路分析等&#xff0c;以支持从概念设计到生产部署的整个开发周期。…

Vue19 列表过滤

直接上代码 以下代码使用了两种实现方式&#xff0c;监视属性和计算属性 当能用计算属性实现时&#xff0c;推荐使用计算属性 <!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>列表过滤</title><script type&q…

阿里元境亮相第八届世界物联网大会,分享元计算对数字文旅的创新赋能

2023&#xff08;第八届&#xff09;世界物联网大会于11月20日在中国北京隆重开幕。联合国秘书长安东尼奥古特雷斯在开幕式发表书面致辞时特别提到&#xff1a;“在一个相互连接的世界&#xff0c;你们的主题‘新物联、新经济、新时代’是数字技术影响力的见证”。 11月21日上午…

Linux系统常用指令大全(图文详解)

目录 前言 一、UNIX的登录与退出 1、登录 &#xff08;1&#xff09;执行格式&#xff1a; &#xff08;2&#xff09;步骤 2、退出 二、UNIX命令格式 三、常用命令 1、目录操作 &#xff08;1&#xff09;显示目录文件 ls &#xff08;2&#xff09;建新目录 …