初阶数据结构:栈与队列
目录
- 1. 简述:栈
- 2. 栈的功能分析与实现
- 2.1 功能分析
- 2.2 栈的实现
- 2.2.1 栈的结构创建与初始化
- 2.2.2 压栈,出栈与判空:
- 2.2.3 获取栈顶元素,检索栈的长度与栈的销毁
- 3. 简述:队列
- 4. 队列的功能分析与实现
- 4.1 队列的功能分析
- 4.2 队列的实现
- 4.2.1 队列的结构与初始化
- 4.2.2 队列的插入和删除操作
- 4.2.3 返回队首与队尾元素,计算队列有效元素长度
- 4.2.4 队列的销毁
1. 简述:栈
- 栈为一种特殊的线性表,它只允许在指定的一端进行数据的插入和删除操作。被指定进行插入和删除操作的一端被称为栈顶,另一端,被称为栈底,其遵循着数据的先进后出原则。
- 压栈:栈插入数据的操作被称为进栈,压栈等
- 出栈:栈的删除操作被称为出栈。

2. 栈的功能分析与实现
2.1 功能分析
- 栈的创建与初始化:stackinit
- 栈的插入与删除操作:stackpush,stackpop
- 获取栈顶元素与检测栈中的有效元素个数:stacktop,stacksize
- 栈的判空与销毁:stackempty,stackdestroy
2.2 栈的实现
2.2.1 栈的结构创建与初始化
静态栈与动态栈:
- 静态栈:在定义初始化就指定了栈的大小,容量不可根据所需动态增长
- 动态栈:会根据存储数据的增多不断扩大自身的容量
注:动态栈更具有学习与应用意义,以下内容都默认为动态栈
栈的结构:
补充:栈的数据结构只对逻辑上有要求,必须满足元素的先进后出与栈顶,栈底的逻辑结构。因此,具体实现时使用数组或链表都可,数组的结构方便实现与适合栈。(数组栈)
//静态栈
typedef int STDataType;
#define N 10
typedef struct Stack
{STDataType _a[N];int _top; // 栈顶
}Stack;// 支持动态增长的栈
typedef int STDataType;
typedef struct Stack
{STDataType* _a;int _top; // 栈顶int _capacity; // 容量
}Stack;
栈的扩容与初始化:
//扩容
void CheckCapacity(Stack* ps)
{if (ps->_capacity == ps->_top){int newcapacity = ps->_capacity == 0 ? 4 : 2 * ps->_capacity;STDataType* data = (STDataType*)realloc(ps->_a, newcapacity * sizeof(STDataType));if (data == NULL){perror("realloc failed");exit(-1);}ps->_a = data;ps->_capacity = newcapacity;}
}//初始化
void StackInit(Stack* ps)
{ps->_capacity = 0;ps->_top = 0;ps->_a = NULL;CheckCapacity(ps);
}
2.2.2 压栈,出栈与判空:
//压栈
void StackPush(Stack* ps, STDataType data)
{assert(ps);CheckCapacity(ps);ps->_a[ps->_top] = data;ps->_top++;
}//判空
int StackEmpty(Stack* ps)
{assert(ps);return ps->_top == 0;
}//出栈
void StackPop(Stack* ps)
{assert(!StackEmpty(ps));ps->_top--;
}
2.2.3 获取栈顶元素,检索栈的长度与栈的销毁
//获取栈顶元素
STDataType StackTop(Stack* ps)
{assert(ps);assert(!StackEmpty(ps));return ps->_a[ps->_top - 1];
}//检索栈的长度
int StackSize(Stack* ps)
{assert(ps);return ps->_top;
}//销毁栈
void StackDestroy(Stack* ps)
{assert(ps);free(ps->_a);ps->_capacity = ps->_top = 0;
}
3. 简述:队列
队列为一种只允许在一端插入数据,在另一端删除数据的特殊线性表,其遵循着先进先出的原则。进行插入操作的一侧被称为队尾,进行删除操作的一侧被称为队首。

4. 队列的功能分析与实现
4.1 队列的功能分析
- 队列的结构与初始化:queueinit
- 队列的插入与删除操作:queuepush,queuepop
- 获取队尾与队头元素:queuefront,qeueuback
- 获取队列中有效元素个数:queuesize
- 队列判空与销毁:queueempty,queuedestroy
4.2 队列的实现
4.2.1 队列的结构与初始化
注:因为队列的删除操作为头删,所以此处采用头删更为方便的链式结构:链表。
队列的结构:
typedef int QDataType;//队列结点
typedef struct QListNode
{struct QListNode* _pNext;QDataType _data;
}QNode;// 队列的结构(队列的头尾)
typedef struct Queue
{QNode* _front;QNode* _rear;
}Queue;
队列的初始化:
void QueueInit(Queue* q)
{assert(q);q->_front = q->_rear = NULL;
}
4.2.2 队列的插入和删除操作
创建新结点与插入操作:
//结点申请
QNode* BuyNewNode2(QDataType data)
{QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc failed");exit(-1);}newnode->_data = data;newnode->_pNext = NULL;return newnode;
}//插入
void QueuePush(Queue* q, QDataType data)
{assert(q);QNode* newnode = BuyNewNode2(data);if (q->_front == NULL){q->_front = q->_rear = newnode;}else{q->_rear->_pNext = newnode;q->_rear = q->_rear->_pNext;}
}
判空与删除操作:
//判空
int QueueEmpty(Queue* q)
{assert(q);return q->_front == NULL;
}//删除
void QueuePop(Queue* q)
{assert(q);assert(!QueueEmpty(q));QNode* cur = q->_front->_pNext;free(q->_front);q->_front = cur;if (q->_front == NULL){q->_rear = NULL;}
}
4.2.3 返回队首与队尾元素,计算队列有效元素长度
//返回队头元素
QDataType QueueFront(Queue* q)
{assert(q);assert(!QueueEmpty(q));return q->_front->_data;
}//返回队尾元素
QDataType QueueBack(Queue* q)
{assert(q);assert(!QueueEmpty(q));return q->_rear->_data;
}//返回队列有效长度
int QueueSize(Queue* q)
{assert(q);int count = 0;QNode* cur = q->_front;while (cur){cur = cur->_pNext;count++;}return count;
}
4.2.4 队列的销毁
void QueueDestroy(Queue* q)
{assert(q);while (q->_front){QueuePop(q);}
}
相关文章:
初阶数据结构:栈与队列
目录 1. 简述:栈2. 栈的功能分析与实现2.1 功能分析2.2 栈的实现2.2.1 栈的结构创建与初始化2.2.2 压栈,出栈与判空:2.2.3 获取栈顶元素,检索栈的长度与栈的销毁 3. 简述:队列4. 队列的功能分析与实现4.1 队列的功能分…...
Houdini学习笔记
按住Alt / 空格 左键:进行旋转 按住Alt / 空格 中间:移动屏幕画面 按住Alt / 空格 右键:缩放视口 如果不要Alt,就先按ESC,再去左键、中键、右键操作 这里有对应的层级关系,类似于树形结构ÿ…...
电销机器人识别客户情绪状态
最近有电销机器人需求的客户咨询我,你们OKCC的机器人可以识别客户的情绪变化吗?别人说目前电销机器人系统有支持的。 首先还是从原理的角度解答一下,是否能识别情绪状态。 是的,电销机器人可以识别客户的情绪状态。这可以通过语音…...
AI推介-大语言模型LLMs论文速览(arXiv方向):2024.02.25-2024.03.01
论文目录~ 1.Arithmetic Control of LLMs for Diverse User Preferences: Directional Preference Alignment with Multi-Objective Rewards2.Keeping LLMs Aligned After Fine-tuning: The Crucial Role of Prompt Templates3.Meta-Task Prompting Elicits Embedding from Lar…...
Cesium插件系列——3dtiles压平
本系列为自己基于cesium写的一套插件具体实现。 这里是根据Cesium提供的CustomShader来实现的。 在CustomShader的vertexShaderText里,需要定义vertexMain函数,例如下: struct VertexInput {Attributes attributes;FeatureIds featureIds;…...
APS面试审核准备的常规问题
之前根据其他人的经验贴,准备了一些可能APS 面试审核可能会遇到的常规问题,现在简单分享一下。 一般会考虑到留学资金来源,在德国能不能顺利毕业;学的是什么专业内容之类的,判断去德国会不会好好学习;对德国…...
jvm 基础知识和jvm 调优
类装载分为以下 5 个步骤: 加载:根据查找路径找到相应的 class 文件然后导入; 检查:检查加载的 class 文件的正确性; 准备:给类中的静态变量分配内存空间; 解析:虚拟机将常量池中的符…...
USB4之ASM2464PD与ASM2464PDX兼容与运用
首先在NVMe上运用: 一:ASM2464PD(现在可以做带PD的方案) 二:ASM2464PDX 1: Application Guide- CFX card reader NVMe SSD 2:ASM2464PDX Application Guide- NVMe SSD x4 with data clone 三ÿ…...
python笔记_进制
二进制 进位规则:满2进1 范围:0,1 符号:以0b和0B开头 八进制 进位规则:满8进1 范围:0-7 符号:以0o和0O开头 十进制 进位规则:满10进1 范围:0-9 十六进制 进位规则ÿ…...
面试数据库篇(mysql)- 05什么是聚簇索引什么是非聚簇索引
聚集索引选取规则: 如果存在主键,主键索引就是聚集索引。如果不存在主键,将使用第一个唯一(UNIQUE)索引作为聚集索引。如果表没有主键,或没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索…...
如何开好一家汽车美容店,汽车美容保养与装饰教学
一、教程描述 本套教程共由17张VCD组合而成,教程内容主要包括:美容店的设立和管理,汽车系统与内部结构,汽车美容工具与美容设备,美容用品的选择与使用,车身打蜡镀膜与内外清洁,车身抛光与漆面处…...
Taro + node.js 注册 仿照java 中的加盐算法
1.需求 为了让用户的密码更加保密 我们在md5 之前 在加一个随机数 用java 的说法 叫做 加盐算法 2.代码 //H5注册async H5Register(register) {if (!register.phone ||!register.password ||!register.confirmPassword ||!register.yzmCode ||!register.registerCode) {thr…...
全量知识系统问题及SmartChat给出的答复 之9 三套工具之4语法解析器 之2
Q23. 一个语言的语法简约规则 这些规则显示show 在一个给定单词(a given word)的右边或左边可能出现的单词的类别。句型的多样性variety不是复杂文法(a complex grammar)的结果,而是简单语法(a simple gra…...
简洁版用户登录系统
前端页面: 用户登录首页: <!doctype html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport"content"widthdevice-width, user-scalableno, initial-scale1.0, maximu…...
Android 监听网络状态变化
文章目录 Android 监听网络状态变化封装工具类使用 Android 监听网络状态变化 封装工具类 <uses-permission android:name"android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name"android.permission.ACCESS_WIFI_STATE"…...
【LeetCode】一周中的第几天+ 一年中的第几天
2023-12-30 文章目录 一周中的第几天方法一:模拟思路步骤 方法二:调用库函数方法三:调用库函数 [1154. 一年中的第几天](https://leetcode.cn/problems/day-of-the-year/)方法一:直接计算思路: 方法二:调用…...
深度学习 精选笔记(10)简单案例:房价预测
学习参考: 动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增),以达到集多方教程的精华于一文的目的。 ③非常推荐上面(学习参考&#x…...
DBGridEh 的排序
DBGridEh 可以点列抬头使得记录按该列排序 不需要写代码,只需要设置好,它就能排序。 网上的文章一般写了如何设置。但一般都少说了一条。 先说如何设置: 1. OptionsEh.AutoSortMarking 设置为 True,如果是设计期属性面板&…...
spring-boot-starter-parent和spring-boot-dependencies介绍
springboot项目的pom文件中,我们经常看见这样(下图)两种springboot的版本依赖管理方式;图片中的这两种依赖声明方式任意用其中一种都可以。文章后面会简单阐述一下区别和使用场景。 事例中完整的pom文件 <?xml version"1.0" encoding&quo…...
缓存穿透解决方案之布隆过滤器
布隆过滤器可以快速判断数据是否存在,避免从数据库中查询数据是否存在,减轻数据库的压力 布隆过滤器是由一个初值为0的bit数组和N个哈希函数,可以用来快速的判断某个数据是否存在 当我们想要标记某个数据是否存在时,布隆过滤器会…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...
SpringAI实战:ChatModel智能对话全解
一、引言:Spring AI 与 Chat Model 的核心价值 🚀 在 Java 生态中集成大模型能力,Spring AI 提供了高效的解决方案 🤖。其中 Chat Model 作为核心交互组件,通过标准化接口简化了与大语言模型(LLM࿰…...
华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)
题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...
【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL
ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...
针对药品仓库的效期管理问题,如何利用WMS系统“破局”
案例: 某医药分销企业,主要经营各类药品的批发与零售。由于药品的特殊性,效期管理至关重要,但该企业一直面临效期问题的困扰。在未使用WMS系统之前,其药品入库、存储、出库等环节的效期管理主要依赖人工记录与检查。库…...
