数据结构入门 — 栈

本文属于数据结构专栏文章,适合数据结构入门者学习,涵盖数据结构基础的知识和内容体系,文章在介绍数据结构时会配合上动图演示,方便初学者在学习数据结构时理解和学习,了解数据结构系列专栏点击下方链接。

  • 博客主页:Duck Bro 博客主页

  • 系列专栏:数据结构专栏

  • 关注博主,后期持续更新系列文章

  • 如果有错误请大家批评指出,博主会及时修改

  • 感谢大家点赞👍收藏⭐评论✍


数据结构入门 — 栈

本文关键字:栈、概念及结构、动图、接口实现

文章目录

  • 数据结构入门 — 栈
    • 1. 栈的概念及结构
      • 1.1 栈的概念
      • 1.2 栈的结构
    • 2. 栈的实现
      • 2.1 动态增长栈结构
      • 2.2 初始化栈
      • 2.3 入栈
      • 2.4 出栈
      • 2.5 获取栈顶元素
      • 2.6 获取栈中有效元素个数
      • 2.7 检测栈是否为空
      • 2.8 销毁栈


1. 栈的概念及结构

1.1 栈的概念

栈(Stack)是一种特殊的线性数据结构,它的特点是仅允许在一端进行插入和删除操作。这一端被称为栈顶(Top),另一端称为栈底(Bottom)。栈的操作模式为后进先出(Last In First Out,LIFO),是一种简单的“先进后出”的顺序结构。

栈通常可以用数组或链表实现,常用的操作包括入栈(Push)和出栈(Pop)。入栈操作是将新的元素插入到栈顶,出栈操作是将栈顶的元素删除并返回。此外,栈还有一些其他的操作,如获取栈顶元素(Top)、判断栈是否为空(IsEmpty)等。往栈中插入元素的操作叫做push,从栈中删除元素的操作叫做pop,查看栈顶元素的操作叫做top。
在这里插入图片描述

1.2 栈的结构

栈结构可以用数组或链表实现

  1. 数组实现栈:栈底用数组下标为0的位置,栈顶用数组下标为n-1的位置(n为数组长度)。入栈操作就是将元素插入到数组末尾,出栈操作就是将数组末尾元素删除并返回。由于数组有固定的大小,因此当栈满时就无法再插入元素,这种情况称为栈溢出。

  2. 链表实现栈:链表中的每个节点保存一个元素和一个指向下一个节点的指针。栈顶指针指向链表的头部,入栈操作就是将新元素插入到链表头部,出栈操作就是将链表头部元素删除并返回。由于链表的大小能够动态地调整,因此它即使在没有预留额外空间的情况下也能灵活地添加或删除元素。

在实现栈时,还需要考虑一些细节问题,比如空栈的情况,如何判断栈满或栈空等。

2. 栈的实现

2.1 动态增长栈结构

使用动态增长的结构,top为栈内元素个数、capacity表示栈内的容量

typedef int STDatatype;typedef struct StackList
{STDatatype* a;int top;int capacity;
}STL;

2.2 初始化栈

初始化先将指针a置为空,top、capacity置为0

void STInit(STL* pc)
{assert(pc);pc->a = NULL;pc->top = 0;pc->capacity = 0;
}

2.3 入栈

这里使用realloc函数的特性,当指针为空时,跟malloc函数的效果相同,入栈即尾插

void STPush(STL* pc, STDatatype x)
{assert(pc);if (pc->capacity == pc->top){int newcapacity = pc->capacity == 0 ? 4 : pc->capacity * 2;STDatatype* temp = (STDatatype*)realloc(pc->a, sizeof(STDatatype) * newcapacity);if (temp == NULL){perror("realloc fail");exit(-1);}pc->a = temp;pc->capacity = newcapacity;}pc->a[pc->top] = x;pc->top++;
}

2.4 出栈

这里的出栈,即尾删

void STPop(STL* pc)
{assert(pc);assert(pc->top > 0);--pc->top;
}

2.5 获取栈顶元素

top指向栈顶的后一个,获取栈顶元素时要将top减1

STDatatype STTop(STL* pc)
{assert(pc);assert(pc->top > 0);return pc->a[pc->top - 1];
}

2.6 获取栈中有效元素个数

top中记录了栈内的元素个数,直接返回top即可

int STSize(STL* pc)
{assert(pc);return pc->top;
}

2.7 检测栈是否为空

如果栈内为空,则top为0就是栈是空的

bool STEmpty(STL* pc)
{assert(pc);return pc->top == 0;
}

2.8 销毁栈

释放a内的内存。将top\capacity置为0

void STDestroy(STL* pc)
{assert(pc);free(pc->a);pc->a = NULL;pc->top = pc->capacity = 0;
}

在这里插入图片描述

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

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

相关文章

Linux 忘记密码解决方法

很多朋友经常会忘记Linux系统的root密码,linux系统忘记root密码的情况该怎么办呢?重新安装系统吗?答案是不需要进入单用户模式更改一下root密码即可。 步骤如下: 重启linux系统 3 秒之内要按一下回车,出现如下界面 …

VUE笔记(十)Echarts

一、Echarts简介 1、什么是echarts ECharts是一款基个基于 JavaScript 的开源可视化图表库 官网地址:Apache ECharts 国内镜像:ISQQW.COM x ECharts 文档(国内同步镜像) - 配置项 示例:echarts图表集 2、第一个E…

滑动窗口实例4(将x减到0的最小操作数)

题目: 给你一个整数数组 nums 和一个整数 x 。每一次操作时,你应当移除数组 nums 最左边或最右边的元素,然后从 x 中减去该元素的值。请注意,需要 修改 数组以供接下来的操作使用。 如果可以将 x 恰好 减到 0 ,返回 …

全套解决方案:基于pytorch、transformers的中文NLP训练框架,支持大模型训练和文本生成,快速上手,海量训练数据!

全套解决方案:基于pytorch、transformers的中文NLP训练框架,支持大模型训练和文本生成,快速上手,海量训练数据! 1.简介 目标:基于pytorch、transformers做中文领域的nlp开箱即用的训练框架,提…

WebGPU加载Wavefront .OBJ模型文件

在开发布料模拟之前,我想使用 WebGPU 开发强大的代码基础。 这就是为什么我想从 Wavefront .OBJ 文件加载器开始渲染 3D 模型。 这样,我们可以快速渲染 3D 模型,并构建一个简单而强大的渲染引擎来完成此任务。 一旦我们有了扎实的基础&#x…

视频文件损坏无法播放如何修复?导致视频文件损坏的原因

如果我们遇到因视频文件损坏而无法正常播放,我们该怎么办?这种情况通常意味着视频文件已经损坏。我们不能访问、编辑或使用它们。那么应该用什么正确的工具和修复程序来修复视频呢? 视频文件损坏的原因 了解视频损坏如何修复之前&#xff0c…

【C51基础实验 LED流水灯】

51单片机项目基础篇 LED流水灯1、硬件电路设计和原理分析2、软件设计2.1、利用循环和移位操作符功能实现:LED流水灯2.2、利用利用封装好的库函数功能实现:LED流水灯 3、编译结果4、结束语 LED流水灯 前言: 前几篇学会了LED驱动原理&#xff…

Mysql001:Mysql概述以及安装

前言:本课程将从头学习Mysql,以我的工作经验来说,sql语句真的太重要的,现在互联网所有的一切都是建立在数据上,因为互联网的兴起,现在的数据日月增多,每年都以翻倍的形式增长,对于数…

数据库CPU飙高问题定位及解决

在业务服务提供能力的时候,常常会遇到CPU飙高的问题,遇到这类问题,大多不是数据库自身问题,都是因为使用不当导致,这里记录下业务服务如何定位数据库CPU飙高问题并给出常见的解决方案。 CPU 使用率飙升根因分析 在分…

概念解析 | 量子时代的灵感:探索量子感知技术

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:量子感知技术。 量子时代的灵感:探索量子感知技术 量子感知技术是一个充满希望和挑战的新兴领域。在此,我们将深入探讨这个主题,概述其背景,解释其工作原理,讨论现有的…

mov怎么改成mp4?跟我一起操作吧

mov怎么改成mp4?mov因为并不是一种常见的视频文件格式,因此大家对这种视频文件可能知道的并不多,但如果你是用的是苹果手机,那么你会发现苹果手机拍摄的视频转移到电脑上后就是mov格式的,因为mov格式的视频并没有受到大…

JDBC使用了哪种设计模式

JDK中提供了操作数据库的接口,比如 java.sql.Driver java.sql.Connection java.sql.Statement java.sql.PreparedStatement 不同的数据库厂商提供操作自己数据库的驱动包, 比如mysql public class Driver extends NonRegisteringDriver implements jav…

一篇文章带你了解-selenium工作原理详解

前言 Selenium是一个用于Web应用程序自动化测试工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome&#xff0c…

DC电源模块不同的尺寸可以适应实际应用场景

BOSHIDA DC电源模块不同的尺寸可以适应实际应用场景 DC电源模块是现代电子设备的必备部件之一,其可提供稳定的直流电源,保证电子设备正常运行。DC电源模块尺寸的选择直接影响到其适应的应用场景及其性能表现。本文将从尺寸方面分析DC电源模块的适应性&a…

【zookeeper】zookeeper介绍

分布式协调技术 在学习ZooKeeper之前需要先了解一种技术——分布式协调技术。那么什么是分布式协调技术?其实分布式协调技术主要用来解决分布式环境当中多个进程之间的同步控制,让他们有序的去访问某种临界资源,防止造成"脏数据"的…

C++ list模拟实现

list模拟实现代码&#xff1a; namespace djx {template<class T>struct list_node{T _data;list_node<T>* _prev;list_node<T>* _next;list_node(const T& x T()):_data(x),_prev(nullptr),_next(nullptr){}};template<class T,class Ref,class Pt…

Mac操作系统Safari 17全新升级:秋季推出全部特性

苹果的内置浏览器可能是Mac上最常用的应用程序&#xff08;是的&#xff0c;甚至比Finder、超级Mac Geeks还要多&#xff09;。因此&#xff0c;苹果总是为其浏览器Safari添加有用的新功能。在今年秋天与macOS Sonoma一起推出的第17版中&#xff0c;Safari可以帮助你提高工作效…

活用 命令行通配符

本文是对 阮一峰老师命令行通配符教程[1]的学习与记录 通配符早于正则表达式出现,可以看作是原始的正则表达式. 其功能没有正则那么强大灵活,而胜在简单和方便. - 字符 切回上一个路径/分支 如图: !! 代表上一个命令, 如图: [Linux中“!"的神奇用法](https://www.cnblogs.…

不会还有人排长队吃饭吧?用这招,快速搞定!

随着现代企业对员工福利和工作环境的关注不断增加&#xff0c;企业智慧食堂已经成为了企业管理的重要组成部分。 智慧收银系统的出现不仅使员工用餐变得更加便捷和高效&#xff0c;还提供了一种强大的管理工具&#xff0c;有助于企业更好地理解员工消费行为、优化食堂运营&…

比较器的工作原理及性能指标介绍

一、什么是比较器 比较器的功能是比较两个或更多数据项&#xff0c;以确定它们是否相等&#xff0c;或者确定它们之间的大小关系和排列顺序&#xff0c;这称为比较。可以实现此比较功能的电路或设备称为比较器。比较器是将模拟电压信号与参考电压进行比较的电路。比较器的两个…