初阶数据结构:栈与队列
目录
- 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个哈希函数,可以用来快速的判断某个数据是否存在 当我们想要标记某个数据是否存在时,布隆过滤器会…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...
MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...
