C语言_数据结构总结5:顺序栈

纯C语言代码,不涉及C++

想了解链式栈的实现,欢迎查看这篇文章:C语言_数据结构总结6:链式栈-CSDN博客

这里分享插入一下个人觉得很有用的习惯:

1. 就是遇到代码哪里不理解的,你就问豆包,C知道,Kimi等等AI工具,比如在这栈中你不能理解为什么有时候要传一级指针有时候又不用,你就询问AI“在进栈操作中是否可以不传入指针变量,而是直接传入结构体变量”;

2. 还有就是自己的代码报错了,又或是自己觉得自己的代码存在某种问题,而自己又不能解决时,你就直接复制自己的代码问AI,让AI对以下代码进行点评,并返回改善后的代码。

前言

:是只允许在一端进行插入或删除操作的线性表。
栈顶:允许进行插入或删除的那一端
栈底:固定的,不允许进行插入或删除的那一端
栈的特性后进先出
存储方式:1. 顺序存储(顺序栈)  2. 链式存储(链式栈)

       在顺序栈的基本操作中,决定是传入一级指针还是只传入栈的变量,主要取决于操作是否需要修改栈的内部状态
    1. 需要传入一级指针的情况
    当操作需要修改栈的内部状态,比如改变栈顶指针 top 的值或者修改栈中存储的数据时,就需要传入一级指针。
    这是因为在 C 语言里,函数参数传递是值传递,若直接传入栈的变量,函数内部对该变量的修改不会影响到原变量。
    而通过传入指针,函数可以直接访问和修改原变量所指向的内存。

    2. 只需要传入栈的变量的情况
    当操作不需要修改栈的内部状态,仅仅是读取栈的信息时,就可以只传入栈的变量。

以下是顺序栈实现
它利用一组地址连续的存储单元存放自栈底到栈顶的数据元素,同时附设一个指针top指示当前的栈顶元素的位置

0. 结构单元

#define MaxSize 50
typedef int ElemType;
typedef struct SqStack {
    ElemType data[MaxSize];  //存放栈中元素
    int top;  //栈顶指针
}SqStack;

!注意  :栈顶指针top,它不是实际意义上的指针变量,进行存放指针变量。这里说它是指针,意思是说,它指示了当前栈顶元素的位置,在第pos个位置。

1. 初始化

void InitSeqStack(SqStack* s) {s->top = -1;  //初始化栈顶的位置
}

这里设置初始栈顶指针s.top = -1,
栈空条件是s.top = -1;栈满条件是s.top = MaxSize - 1
则进栈时指针s.top+1,再将元素加入栈顶;出栈时先取出栈顶元素,后指针s.top - 1

但如果设置初始栈顶指针s.top = 0,
栈空条件是s.top = 0;栈满条件是s.top = MaxSize
则进栈时将元素加入栈顶,再指针s.top+1;出栈时先指针s.top - 1,后取出栈顶元素

2. 判空

int SqStackEmpty(SqStack s) {return s.top == -1;
}

3. 判满

int SqStackFull(SqStack s) {return s.top == MaxSize - 1;
}

4. 入栈

即:将元素加入到栈顶

int push(SqStack* s, ElemType value) {// 1. 判满if (SqStackFull(*s)){printf("栈满,无法入栈!\n");return -2;}// 2. 指针top + 1,再将值加入到栈顶s->top++;s->data[s->top] = value;return 0;  //入栈成功
}

5. 出栈

int pop(SqStack* s, ElemType* value) {//1. 判空if (SqStackEmpty(*s)){printf("栈空,无法有元素出栈!\n");return -1;}//2. 先取出栈顶元素,再指针top - 1*value = s->data[s->top];s->top--;return 0;  //出栈成功
}

6. 获取栈顶元素

int getTop(SqStack s,ElemType *value) {//1. 判空if (SqStackEmpty(s)){printf("栈空,无法有元素出栈!\n");return -1;}//2. 获取栈顶元素*value = s.data[s.top];return 0;  
}

7. 打印栈中元素

void printSqStack(SqStack s) {if (SqStackEmpty(s)){printf("栈空!\n");return;  //提前结束该函数}printf("栈中的元素(从栈底到栈顶)为: ");for (int i = 0; i <= s.top; i++) {printf("%d ", s.data[i]);}printf("\n");
}

8. 销毁

void destroySqStack(SqStack* s) {// 由于顺序栈使用的是静态数组,不需要显式释放内存// 只需要将栈顶指针置为 -1 表示栈为空s->top = -1;
}

9. 测试

int main() {SqStack s;InitSeqStack(&s);// 测试入栈操作push(&s, 11);push(&s, 22);push(&s, 33);printSqStack(s);  // 栈中的元素(从栈底到栈顶)为: 11 22 33// 获取栈顶元素ElemType value;if (getTop(s,&value) == 0){printf("当前栈顶元素为:%d\n", value); // 当前栈顶元素为:33}//测试出栈操作if (pop(&s,&value) == 0){printf("出栈的元素为:%d\n", value);  // 出栈的元素为:33}printSqStack(s);  // 栈中的元素(从栈底到栈顶)为: 11 22//销毁栈destroySqStack(&s);printSqStack(s);  // 栈空!return 0;
}

10. 完整代码

#include<stdio.h>
#include<stdlib.h>
/*栈:是只允许在一端进行插入或删除操作的线性表。栈顶:允许进行插入或删除的那一端栈底:固定的,不允许进行插入或删除的那一端栈的特性:后进先出存储方式:1. 顺序存储(顺序栈)  2. 链式存储(链式栈)
*//*在顺序栈的基本操作中,决定是传入一级指针还是只传入栈的变量,主要取决于操作是否需要修改栈的内部状态。1. 需要传入一级指针的情况当操作需要修改栈的内部状态,比如改变栈顶指针 top 的值或者修改栈中存储的数据时,就需要传入一级指针。这是因为在 C 语言里,函数参数传递是值传递,若直接传入栈的变量,函数内部对该变量的修改不会影响到原变量。而通过传入指针,函数可以直接访问和修改原变量所指向的内存。2. 只需要传入栈的变量的情况当操作不需要修改栈的内部状态,仅仅是读取栈的信息时,就可以只传入栈的变量。*//*以下是顺序栈实现它利用一组地址连续的存储单元存放自栈底到栈顶的数据元素,同时附设一个指针top指示当前的栈顶元素的位置
*/#define MaxSize 50
typedef int ElemType;
typedef struct SqStack {ElemType data[MaxSize];  //存放栈中元素int top;  //栈顶指针(注意,它不是实际意义上的指针变量,进行存放指针变量。这里说它是指针,意思是说,它指示了当前栈顶元素的位置,在第pos个位置。
}SqStack;// 操作1——初始化
void InitSeqStack(SqStack* s) {s->top = -1;  //初始化栈顶的位置
}/*这里设置初始栈顶指针s.top = -1,栈空条件是s.top = -1;栈满条件是s.top = MaxSize - 1则进栈时指针s.top+1,再将元素加入栈顶;出栈时先取出栈顶元素,后指针s.top - 1但如果设置初始栈顶指针s.top = 0,栈空条件是s.top = 0;栈满条件是s.top = MaxSize则进栈时将元素加入栈顶,再指针s.top+1;出栈时先指针s.top - 1,后取出栈顶元素	
*/// 操作2——判空
int SqStackEmpty(SqStack s) {return s.top == -1;
}// 操作3——判满
int SqStackFull(SqStack s) {return s.top == MaxSize - 1;
}// 操作4——入栈,将元素加到栈顶
int push(SqStack* s, ElemType value) {// 1. 判满if (SqStackFull(*s)){printf("栈满,无法入栈!\n");return -2;}// 2. 指针top + 1,再将值加入到栈顶s->top++;s->data[s->top] = value;return 0;  //入栈成功
}// 操作5——出栈
int pop(SqStack* s, ElemType* value) {//1. 判空if (SqStackEmpty(*s)){printf("栈空,无法有元素出栈!\n");return -1;}//2. 先取出栈顶元素,再指针top - 1*value = s->data[s->top];s->top--;return 0;  //出栈成功
}// 操作6——获取栈顶元素
int getTop(SqStack s,ElemType *value) {//1. 判空if (SqStackEmpty(s)){printf("栈空,无法有元素出栈!\n");return -1;}//2. 获取栈顶元素*value = s.data[s.top];return 0;  
}// 操作7——打印栈中元素
void printSqStack(SqStack s) {if (SqStackEmpty(s)){printf("栈空!\n");return;  //提前结束该函数}printf("栈中的元素(从栈底到栈顶)为: ");for (int i = 0; i <= s.top; i++) {printf("%d ", s.data[i]);}printf("\n");
}// 操作8——销毁栈
void destroySqStack(SqStack* s) {// 由于顺序栈使用的是静态数组,不需要显式释放内存// 只需要将栈顶指针置为 -1 表示栈为空s->top = -1;
}int main() {SqStack s;InitSeqStack(&s);// 测试入栈操作push(&s, 11);push(&s, 22);push(&s, 33);printSqStack(s);  // 栈中的元素(从栈底到栈顶)为: 11 22 33// 获取栈顶元素ElemType value;if (getTop(s,&value) == 0){printf("当前栈顶元素为:%d\n", value); // 当前栈顶元素为:33}//测试出栈操作if (pop(&s,&value) == 0){printf("出栈的元素为:%d\n", value);  // 出栈的元素为:33}printSqStack(s);  // 栈中的元素(从栈底到栈顶)为: 11 22//销毁栈destroySqStack(&s);printSqStack(s);  // 栈空!return 0;
}

11. 运行截图

本人菜鸟一只,文章如有出错处,欢迎评论区指正!

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

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

相关文章

2021 年 6 月青少年软编等考 C 语言六级真题解析

目录 T1. 波兰表达式T2. 多项式相加思路分析T3. 扑克牌排序思路分析T4. 表达式求值思路分析T1. 波兰表达式 题目链接:SOJ D1087 此题为 2023 年 12 月三级第三题原题,见 2023 年 12 月青少年软编等考 C 语言三级真题解析中的 T3。 T2. 多项式相加 题目链接:SOJ D1088 我…

AI数字人| Fay开源项目、UE5数字人、本地大模型

数字人实践教程 本教程主要是讲如何在本地UE部署Fay数字人的开源框架。 最终效果可以与人进行自然语言的对话&#xff0c;花了大概10个h的时间到&#xff0c;踩了很多坑&#xff0c;同样想实现的朋友可以作为参考 参考文档&#xff1a;Fay 数字人开源框架 - 飞书云文档 官方的教…

网络版汉译英服务(muduo)

文章目录 网络版汉译英服务&#xff08;muduo&#xff09;muduo库muduo 库是什么muduo 库常见接口介绍muduo::net::EventLoopmuduo::net::TcpConnectionmuduo::net::TcpServermuduo::net::TcpClientmuduo::net::Buffer 汉译英服务服务端客户端 网络版汉译英服务&#xff08;mud…

在ArcMap中通过Python编写自定义工具(Python Toolbox)实现点转线工具

文章目录 一、需求二、实现过程2.1、创建Python工具箱&#xff08;.pyt&#xff09;2.2、使用catalog测试代码2.3、在ArcMap中使用工具 三、测试 一、需求 通过插件的形式将点转线功能嵌入ArcMap界面&#xff0c;如何从零开始创建一个插件&#xff0c;包括按钮的添加、工具的实…

C++之序列容器(vector,list,dueqe)

1.大体对比 在软件开发的漫长历程中&#xff0c;数据结构与算法始终占据着核心地位&#xff0c;犹如大厦的基石&#xff0c;稳固支撑着整个程序的运行。在众多编程语言中&#xff0c;数据的存储与管理方式各有千秋&#xff0c;而 C 凭借其丰富且强大的工具集脱颖而出&#xff…

【学习笔记】【DeepSeek AI 医生】2-2 AI家庭医生课程内容介绍

【DeepSeek AI 医生】2-4 项目详细分析及DeepSeek适用场景 一、Ollama部署二、可视化UI三、构建项目环境四、搭建项目架构五、Spring Al六、SSE服务端推送事件七、数据持久化八、线上部署 一、Ollama部署 Mac部署windows 部署ollama脚本、常用命令DeepSeek 提示词、角色、适用…

STM32 I2C驱动开发全解析:从理论到实战 | 零基础入门STM32第五十步

主题内容教学目的/扩展视频I2C总线电路原理&#xff0c;跳线设置&#xff0c;I2C协议分析。驱动程序与调用。熟悉I2C总线协议&#xff0c;熟练调用。 师从洋桃电子&#xff0c;杜洋老师 &#x1f4d1;文章目录 引言一、I2C驱动分层架构二、I2C总线驱动代码精析2.1 初始化配置&a…

Vercel Serverless

1. 引言 现代应用程序是为适应当前技术环境需求而设计的软件&#xff0c;采用现代开发工具和实践&#xff0c;针对云部署和可扩展性优化。它们由多个模块化小组件组成&#xff0c;便于集成和缩放&#xff0c;具有高度的敏捷性和适应性&#xff0c;能快速响应用户或业务需求变化…

国产操作系统之系统分区及分区的作用

国产操作系统之系统分区及分区的作用和挂载 Linux的系统分区跟Windows有着本质区别,在windows中大家知道c盘一般为系统盘,除c盘系统盘外,我们再分为D、E等文件存储盘,而在Linux中虽然是以文件目录著称的系统,但思路也一样的,比如针对系统分区中 /home、/var 和 /opt 等文…

字节码是由什么组成的?

Java字节码是Java程序编译后的中间产物&#xff0c;它是一种二进制格式的代码&#xff0c;可以在Java虚拟机&#xff08;JVM&#xff09;上运行。理解字节码的组成有助于我们更好地理解Java程序的运行机制。 1. Java字节码是什么&#xff1f; 定义 Java字节码是Java源代码经过…

微前端框架 Qiankun 的应用及问题分析

一、Qiankun 的核心应用场景与优势 多技术栈共存与灵活集成 Qiankun 支持主应用与子应用使用不同技术栈&#xff08;如 Vue、React、Angular 等&#xff09;&#xff0c;通过 HTML Entry 方式接入子应用&#xff0c;无需深度改造子应用即可实现集成&#xff0c;降低了技术迁移成…

function uuid_generate_v4()不存在(二)

说明&#xff1a;之前代码里用到了postgresql内嵌函数uid_generate_v4()生成记录的主键&#xff0c;提示该函数不存在&#xff0c;写了下面这篇博客记录了一下&#xff0c;今天又发现了新的问题&#xff0c;于是补充了这篇博客。 function uuid_generate_v4()不存在&#xff0…

6. 机器人实现远程遥控(具身智能机器人套件)

1. 启动控制脚本 远程作到 Raspberry Pi 中&#xff0c;并运行以下脚本&#xff1a; conda activate lerobotpython lerobot/scripts/control_robot.py \--robot.typelekiwi \--control.typeremote_robot登录笔记本电脑上&#xff0c;同时运行以下脚本&#xff1a; conda ac…

【简单的C++围棋游戏开发示例】

C围棋游戏开发简单示例&#xff08;控制台版&#xff09; ‌核心代码实现‌ #include <iostream> #include <vector> #include <queue> using namespace std;const int SIZE 9; // 简化棋盘为9x9‌:ml-citation{ref"1" data"citationList&…

RK3568平台(音频篇)audio_policy_volumes_drc.xml解析

audio_policy_volumes_drc.xml 是 Android 系统中用于配置音频策略和音量的 XML 文件。它定义了音频流的音量曲线、动态范围控制(DRC)参数以及音频设备的音量设置。该文件通常位于 /vendor/etc/ 或 /system/etc/ 目录下,是 Android 音频框架的重要组成部分。 以下是对 audi…

如何下载安装 PyCharm?

李升伟 整理 一、下载 PyCharm 访问官网 打开 PyCharm 官网&#xff0c;点击 "Download" 按钮25。 版本选择&#xff1a; 社区版&#xff08;Community&#xff09;&#xff1a;免费使用&#xff0c;适合个人学习和基础开发。 专业版&#xff08;Professional&#…

leetcode day27 455+376

455 分发饼干 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[i]&#xff0c;这是能让孩子们满足胃口的饼干的最小尺寸&#xff1b;并且每块饼干 j&#xff0c;都有…

HPC超算系列2——新手指南1

一&#xff0c;平台简介&#xff1a; 主要是官方手册指南、B站视频&#xff08;培训视频、软件视频&#xff09; 1&#xff0c;超算平台架构&#xff1a; 和普通的家用电脑的架构不同&#xff0c; 主要区别在于&#xff1a;层次化的结构 &#xff08;1&#xff09;超算是有…

K8S单机部署

主线 :部署简单的单节点k8s - sowler - 博客园 学习网址&#xff1a;为什么我不能获取到镜像&#xff0c;ImagePullBackoff | Kuboard docker镜像源&#xff1a;https://chuxia.blog.csdn.net/article/details/145090710?spm1001.2101.3001.6650.3&utm_mediumdistribute…

web3区块链

Web3 是指下一代互联网&#xff0c;也被称为“去中心化互联网”或“区块链互联网”。它是基于区块链技术构建的&#xff0c;旨在创建一个更加开放、透明和用户主导的网络生态系统。以下是关于 Web3 的一些关键点&#xff1a; ### 1. **核心概念** - **去中心化**&#xff1…