当前位置: 首页 > news >正文

[全网最细数据结构完整版]第六篇:3分钟带你吃透栈并模拟实现

目录

1->栈的概念和结构

1.1栈的概念

 1.2栈的结构

 2->栈的实现

2.1定义关于栈的结构体和各种函数

2.2栈的初始化 STInit 函数

2.3栈的销毁 STDestroy 函数

2.4栈的插入操作 STPush 函数 

2.5栈的判断是否为空操作 STEmpty 函数 

2.6栈的删除操作 STPop 函数

2.7栈的取栈顶元素操作 STTop 函数

2.8求栈的大小即有效元素的个数 STSize 函数

3->测试下我们自己写的栈

4->您的专属鼓励师


1->栈的概念和结构

1.1栈的概念

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

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

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

 1.2栈的结构

 

 2->栈的实现

栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小.

使用数组模拟原理:

 使用链表模拟原理:

 

// 下面是定长的静态栈的结构,实际中一般不实用,所以我们主要实现下面的支持动态增长的栈
typedef int STDataType;
#define N 10
typedef struct Stack
{STDataType _a[N];int _top; // 栈顶
}Stack;

2.1定义关于栈的结构体和各种函数

#pragma once
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>typedef struct Stack
{int* _arr;//开辟在堆区上存储数据的数组int _top;//栈顶的下一个位置int _capacity;//栈的容量
}ST;//1.栈初始化
void STInit(ST* pst);
//2.栈的销毁
void STDestroy(ST* pst);
//3.栈的插入操作
void STPush(ST* pst, int x);
//4.栈的删除操作
void STPop(ST* pst);
//5.取栈顶元素
int STTop(ST* pst);
//6.判断栈是否为空,空为true,非空为false
bool STEmpty(ST* pst);
//7.求栈的大小即有效元素的个数
int STSize(ST* pst);

2.2栈的初始化 STInit 函数

//1.栈初始化
void STInit(ST* pst)
{assert(pst);pst->_arr = NULL;pst->_capacity = 0;pst->_top = 0;//指向栈顶元素的下一个位置,类似于//之前写的顺序表中的_size,指向未使用位置
}

2.3栈的销毁 STDestroy 函数

//2.栈的销毁
void STDestroy(ST* pst)
{assert(pst);free(pst->_arr);//清理位于堆上的数组pst->_arr = NULL;pst->_capacity = pst->_top = 0;
}

2.4栈的插入操作 STPush 函数 

//3.栈的插入操作
void STPush(ST* pst, int x)
{assert(pst);//插入数据之前判断一下容量是否足够,不够就扩容if (pst->_top == pst->_capacity)//容量满了,扩容{//刚开始插入给4个空间,否则就2倍扩容int newcapacity = (pst->_capacity == 0 ? 4 : pst->_capacity * 2);int* newarr = (int*)realloc(pst->_arr, newcapacity * sizeof(int));if (newarr == NULL){perror("realloc failed");return;}pst->_arr = newarr;pst->_capacity = newcapacity;}//有容量了,插入数据pst->_arr[pst->_top] = x;pst->_top++;
}

2.5栈的判断是否为空操作 STEmpty 函数 

//4.判断栈是否为空,空为true,非空为false
bool STEmpty(ST* pst)
{assert(pst);return pst->_top == 0;
}

2.6栈的删除操作 STPop 函数

//5.栈的删除操作
void STPop(ST* pst)
{//首先你得有元素才能删除对吧assert(pst);assert(!STEmpty(pst));pst->_top--;
}

2.7栈的取栈顶元素操作 STTop 函数

//6.取栈顶元素
int STTop(ST* pst)
{assert(pst);assert(!STEmpty(pst));return pst->_arr[pst->_top - 1];
}

2.8求栈的大小即有效元素的个数 STSize 函数

//7.求栈的大小即有效元素的个数
int STSize(ST* pst)
{assert(pst);return pst->_top;
}

3->测试下我们自己写的栈

#include "Stack.h"//1.测试栈插入,删除,取栈顶元素
void testStack1()
{ST st;STInit(&st);STPush(&st, 1);STPush(&st, 2);STPush(&st, 3);STPush(&st, 4);STPush(&st, 5);while (!STEmpty(&st)){printf("%d : ",STTop(&st));STPop(&st);}STDestroy(&st);}int main()
{testStack1();return 0;
}

运行,看控制台输出:欧耶,我们自己写的栈可以正常运行

4->您的专属鼓励师

        有些事情,你永远都没有办法做到“顶尖”,因为智力跟不上.但是所有的事情,你都可以做到“高段”,因为它需要的是时间的累积和精力的打磨.不聪明与聪明之间的区别,是很微妙的.有时候我们只会通过一次两次的结果,来判断整个人、整件事,其实这是不明智的.从小,邻居和亲戚在谈论我的时候,都会觉得我很聪明。但是只有我自己知道,我从来没有聪明过,只是看上去比较聪明而已.

        修行之路确实枯燥,但是我们把问题搞懂以后就发现他是那样的美妙!一遍学不会没关系吖,多看几遍,我也是学了好多遍呢,小伙伴们肯定学的又快又好!!!最后希望写的内容对小伙伴们有所帮助,我写的如果有哪里不对的地方请在评论区或者私信指出来哦!让我们一起进步吖,任何疑问包括心情不好都可以找我聊聊,我很乐意当你的倾听者吖.   

相关文章:

[全网最细数据结构完整版]第六篇:3分钟带你吃透栈并模拟实现

目录 1->栈的概念和结构 1.1栈的概念 1.2栈的结构 2->栈的实现 2.1定义关于栈的结构体和各种函数 2.2栈的初始化 STInit 函数 2.3栈的销毁 STDestroy 函数 2.4栈的插入操作 STPush 函数 2.5栈的判断是否为空操作 STEmpty 函数 2.6栈的删除操作 STPop 函数 2.7…...

如何在 Docker 容器中启动 X11 图形界面程序

如何在 Docker 容器中启动 X11 图形界面程序 在使用 Docker 时&#xff0c;我们通常会发现&#xff0c;容器中的图形应用没法直接显示到宿主机的界面上。不过&#xff0c;我们可以通过共享 X11 的 Unix 套接字&#xff0c;让容器把显示数据传递给宿主机的 X11 服务器&#xff…...

pycharm保存是自动格式化

在PyCharm中设置保存时自动格式化代码&#xff0c;可以按照以下步骤进行&#xff1a; 1. 打开设置 在Windows和Linux系统中&#xff0c;可以通过File&#xff08;文件&#xff09;->Settings&#xff08;设置&#xff09;打开设置窗口&#xff1b;在Mac系统中&#xff0c;…...

.netCore WebAPI中字符串加密与解密

In today’s digital landscape, securing sensitive information is more critical than ever. If you’re using ASP.NET Core, you might store configuration settings in appsettings.json. However, hardcoding sensitive data like connection strings or API keys in p…...

Next.js + Move 石头剪刀布

rock-paper-scissors 写在前面 本地 源码&#xff1a;https://github.com/zcy1024/SuiStudy/tree/main/rock-paper-scissors # 或其它等价的命令来安装依赖并将项目跑起来 pnpm install pnpm run dev # http://localhost:3000/在线&#xff08;如果没过期的话&#xff09; …...

[面试]关于Redis 的持久化你了解吗

Redis的持久化是指Redis服务器在关闭或重启时&#xff0c;将内存中的数据保存到磁盘上的一种机制。Redis支持多种持久化方式。 一、RDB&#xff08;Redis Database&#xff09;持久化 RDB持久化是Redis默认采用的持久化方式&#xff0c;它将Redis在某个时间点的数据保存到磁盘上…...

Systemd:tmpfiles

Systemd提供了一个结构化的可配置方法来管理临时文件和目录,即systemd-tmpfiles,可以创建、删除和管理临时文件的服务。 $ systemctl list-units --all | grep systemd-tmpfilessystemd-tmpfiles-clean.service load…...

【Flutter 内嵌 android 原生 View以及相互跳转】

Flutter 内嵌 android 原生 View以及相互跳转 一. 内嵌android 原生View二、android 与 flutter 相互跳转 一. 内嵌android 原生View 在android 工程的包名下&#xff0c;也可在MainActivity创建 android 原生view &#xff0c;继承PlatformView // 1.自定义textview public st…...

python externally-managed-environment 外部管理环境

https://realpython.com/python-virtual-environments-a-primer/?refyaolong.net#why-do-you-need-virtual-environments 简而言之&#xff0c; pip 默认会将您安装的所有外部包放置在 Python 安装路径/site-packages/ 的文件夹中一些Linux 和 macOS操作系统 预装了内部的 P…...

前端 | MYTED单篇TED词汇学习功能优化

文章目录 &#x1f4da;实现效果&#x1f407;before&#x1f407;after &#x1f4da;模块实现解析&#x1f407;html&#x1f407;css&#x1f407;javascript &#x1f4da;实现效果 &#x1f407;before 点击TED单篇词汇表按钮&#xff0c;选择对应TED打卡号&#xff0c;…...

64 mysql 的 表锁

前言 我们这里来说的就是 我们在 mysql 这边常见的 几种锁 行共享锁, 行排他锁, 表意向共享锁, 表意向排他锁, 表共享锁, 表排他锁 我们前面了解了行共享锁, 行排他锁, 表意向共享锁, 表意向排他锁 等等相关 我们这里 来看一下 表共享锁, 表排他锁 的获取, 以及 和 其他表级…...

【计网不挂科】计算机网络期末考试——【选择题&填空题&判断题&简述题】题库(1)

前言 大家好吖&#xff0c;欢迎来到 YY 滴计算机网络 系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 本博客主要内容&#xff0c;收纳了一部门基本的计算机网络题目&#xff0c;供yy应对期中考试复习。大家可以参考 欢迎订阅 YY滴其他专栏&#xff01;…...

ajax关于axios库的运用小案例

AJAX案例 图书管理 四大功能&#xff1a; 展示图书删除图书编辑图书信息新增图书 步骤 1.bootstrap弹窗来实现新增和编辑图书时出现的弹窗 有两种方案&#xff1a; a.可以用自带的属性来进行弹窗的显示和隐藏 b.可以通过JS进行控制&#xff0c;此操作可以进行自定义&am…...

微搭低代码入门01变量

目录 1 变量的定义2 变量的赋值3 变量的类型4 算术运算符5 字符串的连接6 模板字符串7 检查变量的类型8 解构赋值8.1 数组的解构赋值8.2 对象的解构赋值 9 类型转换9.1 转换为字符串9.2 转换为数字9.3 转换为布尔值 总结 好些零基础的同学&#xff0c;在使用低代码的时候&#…...

盘点2024年10款视频剪辑,哪款值得pick!!

在这个短视频盛行的时代&#xff0c;如何让我们的故事更生动有趣呢&#xff1f;那就要对短视频进行修饰了。这就需要借助视频剪辑工具&#xff1a;而一款好的工具不仅仅是视频的“美颜”&#xff0c;更是创意的灵魂所在&#xff01;想象一下&#xff0c;运用一款功能齐全的剪辑…...

苹果手机照片批量删除:一键清理,释放空间

在数字化时代&#xff0c;iPhone不仅是我们沟通的桥梁&#xff0c;也是记录生活的重要工具。然而&#xff0c;随着时间的积累&#xff0c;手机中的照片数量不断增加&#xff0c;不仅占用大量存储空间&#xff0c;也让设备变得缓慢。苹果手机照片批量删除成为了一个普遍的需求。…...

《AI 大模型:重塑软件开发新生态》

《AI 大模型&#xff1a;重塑软件开发新生态》 一、AI 大模型引领软件开发新潮流二、AI 大模型在软件开发中的优势&#xff08;一&#xff09;提高开发效率&#xff08;二&#xff09;减少错误与提升质量&#xff08;三&#xff09;激发创新与拓展功能 三、AI 大模型在软件开发…...

uniapp(API-Promise 化)

一、异步的方法&#xff0c;如果不传入 success、fail、complete 等 callback 参数&#xff0c;将以 Promise 返回数据异步的方法&#xff0c;且有返回对象&#xff0c;如果希望获取返回对象&#xff0c;必须至少传入一项 success、fail、complete 等 callback 参数&#xff0c…...

【考研数学 - 数二题型】考研数学必吃榜(数二)

数学二 suhan, 2024.10 文章目录 数学二一、函数❗1.极限1.1求常见极限1.2求数列极限1.2.1 n项和数列极限1.2.2 n项连乘数列极限1.2.3 递推关系定义的数列极限 1.3确定极限式中的参数1.4无穷小量阶的比较 2.连续2.1判断是否连续&#xff0c;不连续则判断间断点类型2.2证明题 二…...

Redis生产问题(缓存穿透、击穿、雪崩)——针对实习面试

目录 Redis生产问题什么是缓存穿透&#xff1f;如何解决缓存穿透&#xff1f;什么是缓存击穿&#xff1f;如何解决缓存击穿&#xff1f;缓存穿透和缓存击穿有什么区别&#xff1f;什么是缓存雪崩&#xff1f;如何解决缓存雪崩&#xff1f; Redis生产问题 什么是缓存穿透&#x…...

android openGL中模板测试、深度测试功能的先后顺序

目录 一、顺序 二、模板测试 1、概念 2、工作原理 3、关键函数 三、深度测试 1、概念 2、工作原理 3、关键函数 三、模板测试和深度测试的先后顺序 一、顺序 在Android OpenGL中&#xff0c;模板测试&#xff08;Stencil Testing&#xff09;是在深度测试&#xff0…...

CCF PTA 编程培训师资认证2021年7月真题- C++兑换礼品

【题目描述】 小零和小壹是两个爱玩游戏的小孩&#xff0c;他俩平时最擅长的是解谜游戏&#xff0c;可今天 遇到了一个有点难的算法问题&#xff0c;希望能得到你的帮助。 他们面对的是一个电子装置&#xff0c;正面有 n 个排成一列的按钮&#xff0c;按钮上贴着编号 1~n 号的…...

火山引擎云服务docker 安装

安装 Docker 登录云服务器。 执行以下命令&#xff0c;添加 yum 源。 yum update -y yum install epel-release -y yum clean all yum list依次执行以下命令&#xff0c;添加Docker CE镜像源。更多操作请参考Docker CE镜像。 # 安装必要的一些系统工具 sudo yum install -y yu…...

【taro react】 ---- 常用自定义 React Hooks 的实现【六】之类渐入动画效果的轮播

1. 效果 2. 场景 css 效果实现:可以看到效果图中就是一个图片从小到大的切换动画效果,这个效果很简单,使用 css 的 transform 的 scale 来实现图片的从小到大的效果,切换就更加简单了,不管是 opacity 还是 visibility 都可以实现图片的隐藏和显示的切换。React.Children.m…...

基础算法练习--滑动窗口(已完结)

算法介绍 滑动窗口算法来自tcp协议的一种特性,它的高效使得其也变成了算法题的一种重要考点.滑动窗口的实现实际上也是通过两个指针前后遍历集合实现,但是因为它有固定的解题格式,我将其单独做成一个篇章. 滑动窗口的解题格式: 首先,定义两个指针left和right,与双指针不同的…...

深度学习经典模型之ZFNet

1 ZFNet 1.1 模型介绍 ​ ZFNet是由 M a t t h e w Matthew Matthew D . Z e i l e r D. Zeiler D.Zeiler和 R o b Rob Rob F e r g u s Fergus Fergus在AlexNet基础上提出的大型卷积网络&#xff0c;在2013年ILSVRC图像分类竞赛中以11.19%的错误率获得冠军&#xff08;实际…...

Linux系统-ubuntu系统安装

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 这是Linux进阶部分的最后一大章。讲完这一章以后&#xff0c;我们Linux进阶部分讲完以后&#xff0c;我们的Linux操作部分就…...

2-Ubuntu/Windows系统启动盘制作

学习目标&#xff1a; 掌握使用Win32DiskImager、Rufus等工具制作系统启动盘的基本步骤。独立将ISO镜像文件写入USB闪存驱动器&#xff0c;确保在需要时顺利安装或修复系统。通过学习如何选择正确的源文件和目标驱动器&#xff0c;理解启动盘的使用场景和注意事项&#xff0c;…...

你使用过哪些MySQL中复杂且使用不频繁的函数?

在MySQL中&#xff0c;除了常用的SELECT、INSERT、UPDATE等基本操作外&#xff0c;还有许多复杂且功能强大的函数&#xff0c;它们能够处理各种复杂的数据处理需求。这些函数虽然在日常开发中可能不常使用&#xff0c;但在特定场景下却能够发挥巨大的作用。下面&#xff0c;我将…...

Redis-07 Redis哨兵

操作实现 此处应该6台虚拟机&#xff0c;其中3台是哨兵&#xff0c;但因为内存限制没有那么多 1.将sentinel文件拷贝到/myredis目录下 2.sentinel.conf文件重要参数 新建配置文件sentinel26379.conf sentinel26380.conf sentinel26381.conf bind 0.0.0.0 daemonize yes pr…...