数据结构之栈详解(C语言手撕)

在这里插入图片描述

在这里插入图片描述

🎉个人名片:

🐼作者简介:一名乐于分享在学习道路上收获的大二在校生
🙈个人主页🎉:GOTXX
🐼个人WeChat:ILXOXVJE
🐼本文由GOTXX原创,首发CSDN🎉🎉🎉
🐵系列专栏:零基础学习C语言----- 数据结构的学习之路----C++的学习之路
🐓每日一句:如果没有特别幸运,那就请特别努力!🎉🎉🎉 ————————————————————————————

🎉文章简介

🎉本篇文章对 用C语言实现栈等相关知识 学习的相关知识进行分享!🎉💕

如果您觉得文章不错,期待你的一键三连哦,你的鼓励是我创作动力的源泉,让我们一起加油,一起奔跑,让我们顶峰相见!!!🎉🎉🎉
————————————————

一.栈的概念及结构

1.1栈的概念

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

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶;
出栈:栈的删除操作叫做出栈。出数据也在栈顶;

1.2栈的结构

在这里插入图片描述入数据和出数据都是从栈顶入和出;保持后进先出的原则*

1.3栈的实现

栈的实现:数组和链表都可以用来实现栈,保证先进后出原则;
数组:尾插就是进栈 尾删就是出栈(相比链表较为方便)
在这里插入图片描述我这里定义的是Top指向的是栈顶元素的下一个位置

链表:可以选择头插进栈 头删出栈
如果选择的是尾插和尾删的话,需要找尾灯操作,不方便

在这里插入图片描述

1.4栈的实现

数组实现栈(相对于链表,数组实现栈更优)

1.4.1功能函数的实现

一般的栈需要完成这几个函数

  1. 栈的初始化
  2. 栈的销毁
  3. 入栈
  4. 出栈
  5. 取栈顶元素
  6. 判断栈是否为空
void StackInit(ST* st);
void StackDestory(ST* st);void StackPush(ST* st, STDateType x);
void StackPop(ST* st);STDateType GetTop(ST* st);
bool StackEmpty(ST* st);

1.定义一个栈的结构体

这里我们实现的是动态的栈
typedef int STDateType;    //方便数据类型的替换
typedef struct Stack        
{STDateType* a;         //存储数据的数组int top;               int capacity;          //容量
}ST;

2.栈的初始化

这里top的初始化不同,top含义就不同;
1.如果top初始化给0,则每次入栈后top就会++;当入第一个数据时,top++后为1,则top含义为指向的是栈顶元素的下一个元素
2.如果top初始化为-1,则含义为指向栈顶元素
void StackInit(ST* st)
{assert(st);st->a = (STDateType* )malloc(4 * sizeof(STDateType));   if (st->a == NULL){perror("malloc fail");exit(-1);}st->top = 0;             //指向栈顶元素的下一个位置st->capacity = 4;        //初始容量给4
}   

3.入栈函数

void StackPush(ST* st, STDateType x)
{assert(st);if (st->top == st->capacity)      //扩容逻辑与顺序表一样{//扩容STDateType* tmp = (STDateType* )realloc(st->a,sizeof(STDateType) * st->capacity *2);if (tmp == NULL)     {perror("malloc fail");exit(-1);}st->a = tmp;st->capacity *= 2;     //2倍扩容}st->a[st->top] = x;      //尾插数据st->top++;
}

4.出栈函数

直接将top--;top--后虽然数据没有改变,但是在下一次入栈时会将原数据给覆盖
void StackPop(ST* st)
{assert(st);st->top--;
}

5.获取栈顶元素

STDateType GetTop(ST* st)
{assert(st);assert(st->top);            //断言return st->a[st->top - 1];    //直接返回top后一个位置的元素
}

6.判断栈是否为空

bool StackEmpty(ST* st)
{assert(st);return st->top;      //返回栈的top,如果为0则为空   非0则不为空;
}

7.栈的销毁函数

void StackDestory(ST* st)
{assert(st);free(st->a);    //释放开辟的空间st->capacity = st->top = 0;    //置空
}

1.5总代码

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>typedef int STDateType;
typedef struct Stack
{STDateType* a;int top;int capacity;
}ST;void StackInit(ST* st);
void StackDestory(ST* st);void StackPush(ST* st, STDateType x);
void StackPop(ST* st);STDateType GetTop(ST* st);
bool StackEmpty(ST* st);
#include"Stack.h"void StackInit(ST* st)
{assert(st);st->a = (STDateType* )malloc(4 * sizeof(STDateType));if (st->a == NULL){perror("malloc fail");exit(-1);}st->top = 0;st->capacity = 4;
}void StackPush(ST* st, STDateType x)
{assert(st);if (st->top == st->capacity){//扩容STDateType* tmp = (STDateType* )realloc(st->a,sizeof(STDateType) * st->capacity *2);if (tmp == NULL){perror("malloc fail");exit(-1);}st->a = tmp;st->capacity *= 2;}st->a[st->top] = x;st->top++;
}void StackPop(ST* st)
{assert(st);st->top--;
}STDateType GetTop(ST* st)
{assert(st);assert(st->top);return st->a[st->top - 1];
}bool StackEmpty(ST* st)
{assert(st);return st->top;
}void StackDestory(ST* st)
{assert(st);free(st->a);st->capacity = st->top = 0;
}

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

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

相关文章

HYBBS 表白墙网站PHP程序源码,支持封装成APP

PHP表白墙网站源码&#xff0c;适用于校园内或校区间使用&#xff0c;同时支持封装成APP。告别使用QQ空间的表白墙。 简单安装&#xff0c;只需PHP版本5.6以上即可。 通过上传程序进行安装&#xff0c;并设置账号密码&#xff0c;登录后台后切换模板&#xff0c;适配手机和PC…

如何在Linux本地搭建Tale网站并实现无公网ip远程访问

文章目录 前言1. Tale网站搭建1.1 检查本地环境1.2 部署Tale个人博客系统1.3 启动Tale服务1.4 访问博客地址 2. Linux安装Cpolar内网穿透3. 创建Tale博客公网地址4. 使用公网地址访问Tale 前言 今天给大家带来一款基于 Java 语言的轻量级博客开源项目——Tale&#xff0c;Tale…

java 解压gzip json报文

import java.io.*; import java.util.zip.GZIPInputStream;public class GzipJsonParser {public static void main(String[] args) {try {// 读取GZIP压缩的JSON报文FileInputStream fis new FileInputStream("compressed.json.gz");GZIPInputStream gzipInputStre…

人工智能与挖矿 为什么要用显卡而不是CPU

人工智能&#xff08;AI&#xff09;和加密货币挖矿都是对计算资源要求很高的应用。在这两种情况下&#xff0c;使用显卡&#xff08;GPU&#xff09;而不是中央处理器&#xff08;CPU&#xff09;的原因主要是因为显卡在处理特定类型的计算任务时具有显著的优势。 1、并行处理…

JMeter 二次开发之环境准备

通过JMeter二次开发&#xff0c;可以充分发挥JMeter的潜力&#xff0c;定制化和扩展工具的能力以满足具体需求。无论是开发自定义插件、函数二次开发还是定制UI&#xff0c;深入学习和掌握JMeter的二次开发技术&#xff0c;将为接口功能测试/接口性能测试工作带来更多的便利和效…

【Linux/OS学习】基础文件控制/IO——内存文件

文章目录 一、 基础文件控制1.1 系统接口open函数1.2 Linux中文件描述符1.2 C语言FILE中的文件描述符 二、重定向1. 输出重定向2. 追加重定向3. 输入重定向 tips:fd的分配规则 一个文件要有一个唯一的文件标识&#xff0c;以便用户识别和引用。 文件名包含3部分&#xff1a;文件…

进电子厂了,感触颇多...

作者&#xff1a;三哥 个人网站&#xff1a;https://j3code.cn 本文已收录到语雀&#xff1a;https://www.yuque.com/j3code/me-public-note/lpgzm6y2nv9iw8ec 是的&#xff0c;真进电子厂了&#xff0c;但主人公不是我。 虽然我不是主人公&#xff0c;但是我经历的过程是和主…

画图--添加了两条水平直线,分别在y=0.092和y=-0.092处。并在水平直线上添加文本

import matplotlib.pyplot as plt import pandas as pd plt.rcParams[font.sans-serif]=[SimHei] #用来正常显示中文标签 plt.rcParams[axes.unicode_minus]=False #用来正常显示负号import matplotlib.pyplot as plt import pandas as pd# 示例函数,绘制曲率变化率图 def dra…

jdk1.8下载与安装 图文版

JDK下载 首先在Oracle官网上下载jdk1.8.https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html,如下图所示&#xff0c;找到jdk1.8,选择对应的版本 或者 链接&#xff1a;https://pan.baidu.com/s/13lZy7JKE1xn-dXx_VG1QFA?pwd29wl 提取码&#xff1a;…

谷歌承认“窃取”OpenAI模型关键信息

什么&#xff1f;谷歌成功偷家OpenAI&#xff0c;还窃取到了gpt-3.5-turbo关键信息&#xff1f;&#xff1f;&#xff1f; 是的&#xff0c;你没看错。 根据谷歌自己的说法&#xff0c;它不仅还原了OpenAI大模型的整个投影矩阵&#xff08;projection matrix&#xff09;&…

Redis高可用之哨兵模式和集群模式

Redis高可用 Redis哨兵高可用 概述 sentinel哨兵是特殊的redis服务&#xff0c;不提供读写服务&#xff0c;主要用来监控redis实例节点。 哨兵架构下client端第一次从哨兵找出redis的主节点&#xff0c;后续就直接访问redis的主节点 不会每次都通过sentinel代理访问redis的主…

路由算法与路由协议

路由选择协议的核心是路由算法&#xff0c;即需要何种算法来获得路由表中的各个项目。 路由算法的目的很简单&#xff1a;给定一组路由器以及连接路由器的链路&#xff0c;路由算法要找到一条从源路由器到目标路由器的最佳路径。通常&#xff0c;最佳路径是指具有最低费用的路…

知识图谱技术综述

作者简介:徐增林(1980 − ),男,博士,教授,主要从事机器学习及其在社会网络分析、互联网、计算生物学、信息安全等方面的研究. 【摘要】 知识图谱技术是人工智能技术的重要组成部分,其建立的具有语义处理能力与开放互联能力的知识库,可在智能搜索、智能问答、个性化推…

TodoList案例——静态组件

Todo-List案例 组件化编码流程 1、实现静态组件&#xff1a;抽取组件&#xff0c;使用组件实现静态页面效果 2、展示动态数据&#xff1a; 2.1数据的类型、名称是什么&#xff1f; 2.2数据保存在哪个组件&#xff1f; 3、交互——从绑定事件监听开始 演示&#xff1a; App组…

九、软考-系统架构设计师笔记-软件可靠性基础知识

1、软件可靠性概念 软件可靠性定义 软件可靠性(Software Reliability)是软件产品在规定的条件下和规定的时间区间完成规定功能的能力。 规定的条件是指直接与软件运行相关的使用该软件的计算机系统的状态和软件的输入条件&#xff0c;或统称为软件运行时的外部输入条件。规定…

自反检索增强生成 (SELF-RAG)

理想情况下&#xff0c;生成式 AI 的落地应用需要提供真实且高质量的响应。SELF-RAG 正是为解决此问题而被创建的。 背景介绍 有趣的是&#xff0c;RAG的发展轨迹与提示工程&#xff08;prompt engineering&#xff09;非常相似。RAG 最初是一个简单而有效的概念&#xff0c;其…

Rust 的 Error 如何使用?

在 Rust 中&#xff0c;错误处理是一个重要且核心的概念。Rust 提供了一种强大的类型系统&#xff0c;允许你明确地处理可能出现的错误。std::error::Error trait 是 Rust 标准库中用于表示错误的基础 trait。实现这个 trait 的类型可以被用作错误类型&#xff0c;并且可以使用…

cocos2d-x-3.17 android升级 gradle NDK_DEBUG=0 -o NDK_DEBUG=1 -o cocos2dlua_shared

由于需要升级sdk版本 需要对应升级gradle版本 记录下升级内容 externalNativeBuild { ndkBuild { - //arguments NDK_DEBUG0 -o 修改成下面 arguments NDK_DEBUG0 } } debug { …

音频功率放大器方案LM4863替代DP4863

音频放大器是在产生声音的输出元件上重建输入的音频信号的设备&#xff0c;其重建的信号音量和功率级都要理想——如实、有效且失真低。音频范围为约20Hz&#xff5e;20000Hz&#xff0c;因此放大器在此范围内必须有良好的频率响应。根据应用的不同&#xff0c;功率大小差异很大…

spring security oauth2 的 scope 概念

在Spring Security OAuth2中&#xff0c;scope用于定义客户端应用程序可以访问的资源范围。这些范围决定了客户端应用程序可以向授权服务器请求哪些权限和资源。以下是一些常见的OAuth2 scope&#xff1a; read: 这个scope允许客户端应用程序读取用户的资源。例如&#xff0c;如…