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

初阶数据结构:栈与队列

目录

  • 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. 简述:栈

  1. 为一种特殊的线性表,它只允许在指定的一端进行数据的插入和删除操作。被指定进行插入和删除操作的一端被称为栈顶,另一端,被称为栈底,其遵循着数据的先进后出原则。
  2. 压栈:栈插入数据的操作被称为进栈,压栈等
  3. 出栈:栈的删除操作被称为出栈。

在这里插入图片描述

2. 栈的功能分析与实现

2.1 功能分析

  1. 栈的创建与初始化:stackinit
  2. 栈的插入与删除操作:stackpush,stackpop
  3. 获取栈顶元素与检测栈中的有效元素个数:stacktop,stacksize
  4. 栈的判空与销毁:stackempty,stackdestroy

2.2 栈的实现

2.2.1 栈的结构创建与初始化

静态栈与动态栈:

  1. 静态栈:在定义初始化就指定了栈的大小,容量不可根据所需动态增长
  2. 动态栈:会根据存储数据的增多不断扩大自身的容量

注:动态栈更具有学习与应用意义,以下内容都默认为动态栈

栈的结构:

补充:栈的数据结构只对逻辑上有要求,必须满足元素的先进后出与栈顶,栈底的逻辑结构。因此,具体实现时使用数组或链表都可,数组的结构方便实现与适合栈。(数组栈

//静态栈
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 队列的功能分析

  1. 队列的结构与初始化:queueinit
  2. 队列的插入与删除操作:queuepush,queuepop
  3. 获取队尾与队头元素:queuefront,qeueuback
  4. 获取队列中有效元素个数:queuesize
  5. 队列判空与销毁: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,再去左键、中键、右键操作 这里有对应的层级关系,类似于树形结构&#xff…...

电销机器人识别客户情绪状态

最近有电销机器人需求的客户咨询我,你们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 三&#xff…...

python笔记_进制

二进制 进位规则:满2进1 范围:0,1 符号:以0b和0B开头 八进制 进位规则:满8进1 范围:0-7 符号:以0o和0O开头 十进制 进位规则:满10进1 范围:0-9 十六进制 进位规则&#xff…...

面试数据库篇(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…...

简洁版用户登录系统

前端页面&#xff1a; 用户登录首页&#xff1a; <!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 文章目录 一周中的第几天方法一&#xff1a;模拟思路步骤 方法二&#xff1a;调用库函数方法三&#xff1a;调用库函数 [1154. 一年中的第几天](https://leetcode.cn/problems/day-of-the-year/)方法一&#xff1a;直接计算思路&#xff1a; 方法二&#xff1a;调用…...

深度学习 精选笔记(10)简单案例:房价预测

学习参考&#xff1a; 动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增)&#xff0c;以达到集多方教程的精华于一文的目的。 ③非常推荐上面&#xff08;学习参考&#x…...

DBGridEh 的排序

DBGridEh 可以点列抬头使得记录按该列排序 不需要写代码&#xff0c;只需要设置好&#xff0c;它就能排序。 网上的文章一般写了如何设置。但一般都少说了一条。 先说如何设置&#xff1a; 1. OptionsEh.AutoSortMarking 设置为 True&#xff0c;如果是设计期属性面板&…...

spring-boot-starter-parent和spring-boot-dependencies介绍

springboot项目的pom文件中&#xff0c;我们经常看见这样(下图)两种springboot的版本依赖管理方式&#xff1b;图片中的这两种依赖声明方式任意用其中一种都可以。文章后面会简单阐述一下区别和使用场景。 事例中完整的pom文件 <?xml version"1.0" encoding&quo…...

缓存穿透解决方案之布隆过滤器

布隆过滤器可以快速判断数据是否存在&#xff0c;避免从数据库中查询数据是否存在&#xff0c;减轻数据库的压力 布隆过滤器是由一个初值为0的bit数组和N个哈希函数&#xff0c;可以用来快速的判断某个数据是否存在 当我们想要标记某个数据是否存在时&#xff0c;布隆过滤器会…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...