数据结构 栈和队列

目录

  • 1. 栈
    • 1.1 栈的概念及结构
    • 1.2 栈的实现
  • 2. 队列
    • 2.1 队列的概念及结构
    • 2.2 队列的实现


正文开始

1. 栈

1.1 栈的概念及结构

栈是线性表的一种,这种数据结构只允许在固定的一端进行插入和删除元素的操作,进行数据插入和删除的一端称为栈顶,另一端称为栈底

这种数据结构的操作方式可以类比为弹匣,存取子弹只能在固定的一端(图源网络,侵删)
在这里插入图片描述


栈对应的两个操作:

  • 压栈:栈的插入操作,又叫进栈/压栈/入栈,插入的数据在栈顶
  • 出栈:栈的删除操作,删除的数据同样在栈顶

栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则
在这里插入图片描述

1.2 栈的实现

下面我们通过c语言来实现栈的结构以及相关操作。

实现栈的结构,我们可以通过顺序表或链表来实现,相对而言通过顺序表实现更好一些,因为顺序表对于尾部的操作效率更高一些。

对于栈我们提供出栈、入栈、判空等接口,下面来看具体代码:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>typedef int STDataType;//通过顺序表来实现栈
typedef struct Stack {STDataType* _a;int _top;		//栈顶int _capacity;	//容量
}Stack;//初始化栈
void StackInit(Stack* ps) {assert(ps);ps->_a = NULL;ps->_capacity = ps->_top = 0;
}//检查空间是否足够
void CheckCapacity(Stack* ps)
{if (ps->_top == ps->_capacity){int NewCapacity = ps->_capacity == 0 ? 4 : 2 * ps->_capacity;STDataType* NewA = (STDataType*)realloc(ps->_a, sizeof(STDataType) * NewCapacity);if (NewA == NULL){perror("realloc fail");}ps->_capacity = NewCapacity;ps->_a = NewA;}
}//入栈
void StackPush(Stack* ps, STDataType data) {assert(ps);CheckCapacity(ps);*(ps->_a + ps->_top) = data;ps->_top++;
}//出栈
void StackPop(Stack* ps)
{assert(ps && ps->_top > 0);ps->_top--;
}//获取栈顶元素
STDataType StackTop(Stack* ps)
{assert(ps && ps->_top > 0);return *(ps->_a + ps->_top - 1);
}//获取栈中有效元素个数
int StatckSize(Stack* ps) {assert(ps);return ps->_top;
}//检测栈是否为空,若为空则返回非零结果
//若不为空则返回0
int StackEmpty(Stack* ps) {return ps->_top == 0;
}//输出栈
void PrintStack(Stack* ps)
{for (int i = 0; i < ps->_top; i++){printf("%d ", *(ps->_a + i));}printf("\n");
}//销毁栈
void StackDestroy(Stack* ps) {assert(ps);free(ps->_a);ps->_a = NULL;ps->_capacity = ps->_top = 0;
}


值得注意的是,关于_top指向问题,有两种情况:

  • _top指向栈顶元素:初始化时应将_top指向 -1 的位置,因为它若指向 0 的位置,无法判断它是否为空。
  • _top指向栈顶元素的下一个位置:初始化时应将_top指向 0 的位置,这样就代表栈为空。上述代码就是按照这种方式的实现的。

2. 队列

2.1 队列的概念及结构

队列:一种只允许在一端进行插入数据操作,在另一端进行删除数据操作的线性表,队列符合先进先出FIFO(First In First Out)

这种数据结构可以类比为排队出门,先进队伍的先出门。

队列对应的两个操作:

  • 入队列:进行插入操作的一端称为队尾
  • 出队列:进行删除操作的一端称为队头

在这里插入图片描述

2.2 队列的实现

队列也可以通过顺序表或链表来实现,相对而言使用链表更优一些,因为使用顺序表在队头出队列时效率较低。

下面我们通过c语言来实现对应的结构和相关操作:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>typedef int QDataType;// 链式结构:表示队列的节点
typedef struct QListNode
{struct QListNode* _next;// 指针域QDataType _data;        // 数据
}QNode;// 在处理队列时,需要用到队列的队头指针和队尾指针
// 所以直接将描述一个队列的信息封装到一个结构体中
// 这样在处理队列时,只需要一个结构体变量就足够了
// 队列的结构
typedef struct Queue
{QNode* _front; // 队头QNode* _rear;  // 队尾int size;      // 节点个数
}Queue;// 初始化队列
void QueueInit(Queue* q) {assert(q);q->_front = q->_rear = NULL;q->size = 0;
}// 申请节点
QNode* QListBuyNode(QDataType x)
{QNode* newNode = (QNode*)malloc(sizeof(QNode));if (newNode == NULL){perror("malloc fail");exit(1);}newNode->_data = x;newNode->_next = NULL;return newNode;
}// 队尾入队列
void QueuePush(Queue* q, QDataType data)
{assert(q);QNode* newNode = QListBuyNode(data);if (q->size == 0){q->_front = q->_rear = newNode;}else {q->_rear->_next = newNode;q->_rear = q->_rear->_next;}q->size++;
}// 队头出队列 
void QueuePop(Queue* q)
{assert(q && q->size);if (q->size == 1){free(q->_front);q->_front = q->_rear = NULL;}else {QNode* PopNode = q->_front;q->_front = q->_front->_next;free(PopNode);PopNode = NULL;}q->size--;
}// 获取队列头部元素 
QDataType QueueFront(Queue* q) {assert(q && q->size);return q->_front->_data;
}// 获取队列队尾元素 
QDataType QueueBack(Queue* q) {assert(q && q->size);return q->_rear->_data;
}// 获取队列中有效元素个数 
int QueueSize(Queue* q) {assert(q);return q->size;
}// 检测队列是否为空
// 如果为空返回非零结果
// 如果非空返回0 
int QueueEmpty(Queue* q) {assert(q);return q->size == 0;
}// 销毁队列 
void QueueDestroy(Queue* q)
{assert(q);while (q->_front) {QueuePop(q);}q->_front = NULL;q->_rear = NULL;
}


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

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

相关文章

Cross Modal Transformer: Towards Fast and Robust 3D Object Detection

代码地址 https://github.com/junjie18/CMT 1. 引言 在本文中&#xff0c;我们提出了Cross-Modal Transformer&#xff08;CMT&#xff09;&#xff0c;这是一种简单而有效的端到端管道&#xff0c;用于鲁棒的3D对象检测&#xff08;见图1&#xff08;c&#xff09;&#xf…

深度学习鲁棒性、公平性和泛化性的联系

深度学习鲁棒性、公平性和泛化性的联系 前言1 鲁棒性、公平性、泛化性本质2 对抗攻击是混杂效应3 因果推理角度3.1 稳定学习 VS 公平性3.2 后门攻击 前言 读研好不容易从边缘智能&#xff0c;费好大劲被允许转到联邦学习赛道&#xff0c;再费了好大劲和机缘巧合被允许转到可信A…

【Vue】简易博客项目跟做

项目框架搭建 1.使用vue create快速搭建vue项目 2.使用VC Code打开新生成的项目 端口号简单配置 修改vue.config.js文件&#xff0c;内容修改如下 所需库安装 npm install vue-resource --save --no-fund npm install vue-router3 --save --no-fund npm install axios --save …

python爬虫指南——初学者避坑篇

目录 Python爬虫初学者学习指南一、学习方向二、Python爬虫知识点总结三、具体知识点详解和实现步骤1. HTTP请求和HTML解析2. 正则表达式提取数据3. 动态内容爬取4. 数据存储5. 反爬虫应对措施 四、完整案例&#xff1a;爬取京东商品信息1. 导入库和设置基本信息2. 获取网页内容…

一文学习Android中的Treeview

在Android开发中&#xff0c;TreeView是一种用于显示层次结构的组件&#xff0c;可以让用户展开和折叠子项&#xff0c;以方便查看数据的不同层次。TreeView在文件系统、组织架构、目录结构等场景中非常有用&#xff0c;尽管Android并未提供内置的TreeView控件&#xff0c;但可…

如何快速搭建一个spring boot项目

一、准备工作 1.1 安装JDK&#xff1a;确保计算机上已安装Java Development Kit (JDK) 8或更高版本、并配置了环境变量 1.2 安装Maven&#xff1a;下载并安装Maven构建工具&#xff0c;这是Spring Boot官方推荐的构建工具。 1.3 安装代码编辑器&#xff1a;这里推荐使用Inte…

SLM401A系列42V商业照明线性恒流芯片 线性照明调光在LED模组及灯带智能球泡灯上应用

SLM401A系列型号选型&#xff1a; SLM401A10ED-7G:QFN1010-4 SLM401A15aa-7G:SOT23-3 SLM401A20aa-7G:SOT23-3 SLM401A20ED-7G:QFN1010-4 SLM401A25aa-7G:SOT23-3 SLM401A30aa-7G:SOT23-3 SLM401A40aa-7G:SOT23-3 SLM401A50aa-7G:SOT23-3 SLM401A6…

HTB:GreenHorn[WriteUP]

目录 连接至HTB服务器并启动靶机 使用nmap对靶机TCP端口进行开放扫描 再次使用nmap对这三个端口进行脚本、服务扫描 尝试先通过curl访问靶机80端口 将靶机IP与该域名写入hosts使DNS本地解析 使用浏览器访问greenhorn.htb 使用Wappalyzer插件查看该页面技术栈 尝试在sea…

HarmonyOS-消息推送

一. 服务简述 Push Kit&#xff08;推送服务&#xff09;是华为提供的消息推送平台&#xff0c;建立了从云端到终端的消息推送通道。所有HarmonyOS 应用可通过集成 Push Kit&#xff0c;实现向应用实时推送消息&#xff0c;使消息易见&#xff0c;构筑良好的用户关系&#xff0…

精选 Top10 开源调度工具,解锁高效工作负裁自动化

在大数据和现代 IT 环境中&#xff0c;任务调度与工作负载自动化&#xff08;WLA&#xff09;工具是优化资源利用、提升生产效率的核心驱动力。随着企业对数据分析、实时处理和多地域任务调度需求的增加&#xff0c;这些工具成为关键技术。 本文将介绍当前技术发展背景下的Top …

【论文阅读】Learning dynamic alignment via meta-filter for few-shot learning

通过元滤波器学习动态对齐以实现小样本学习 引用&#xff1a;Xu C, Fu Y, Liu C, et al. Learning dynamic alignment via meta-filter for few-shot learning[C]//Proceedings of the IEEE/CVF conference on computer vision and pattern recognition. 2021: 5182-5191. 论文…

软件崩溃?提示“由于找不到d3dx9_43.dll”是什么情况?如何有效解决d3dx9_43.dll丢失的方法分享

d3dx9_43.dll错误是电脑经常出现的情况&#xff1f;那么出现“由于找不到d3dx9_43.dll”错误的问题是什么原因导致的呢&#xff1f;同时又有什么办法可以将错误提示“由于找不到d3dx9_43.dll”的问题进行解决呢&#xff1f; d3dx9_43.dll文件缺失是什么情况&#xff1f; d3dx9…

Latex中给公式加边框

1、这里使用的不是 amsmath 的 \boxed 命令, 而是 empheq 的 empheq 环境以及 xcolor 的 \fcolorbox 命令, 下面是代码, 可以分别阅读这两个手册来获取更多的信息 \documentclass{article} \usepackage{xcolor} \usepackage{empheq} \usepackage{amsmath} \begin{document}\be…

设计模式之原型模式(上机考试多套试,每人题目和答案乱序排列场景)

前言&#xff1a; 平常你也付出了很多的时间&#xff0c;但就是没有得到多少收益。就像有时候很多小伙伴问我&#xff0c;我是该怎么学一个我没接触过的内容。我的个人经验非常建议&#xff0c;先不要学太多理论性的内容&#xff0c;而是尝试实际操作下&#xff0c;把要学的内容…

如何提高谷歌收录速度?

相信很多做外贸推广的朋友都遇到过这种情况&#xff1a;网站上线了&#xff0c;但新页面迟迟不被谷歌收录。即使你的内容很优秀&#xff0c;设计也很精美&#xff0c;如果谷歌爬虫抓不到页面&#xff0c;一切努力就白费了。这时候&#xff0c;GSI谷歌快速收录服务就成了“救命稻…

C++builder中的人工智能(15):C++高斯误差线性单元(GELU)

在这篇文章中&#xff0c;我们将探索高斯误差线性单元&#xff08;GELU&#xff1a;Gaussian Error Linear Unit&#xff09;是什么&#xff0c;它是如何在人工神经网络&#xff08;ANN&#xff09;中工作的&#xff0c;以及GELU可以应用于哪些AI技术。通过学习C中的高斯误差线…

Python | Leetcode Python题解之第552题学生出勤记录II

题目&#xff1a; 题解&#xff1a; class Solution:def checkRecord(self, n: int) -> int:MOD 10**9 7mat [[1, 1, 0, 1, 0, 0],[1, 0, 1, 1, 0, 0],[1, 0, 0, 1, 0, 0],[0, 0, 0, 1, 1, 0],[0, 0, 0, 1, 0, 1],[0, 0, 0, 1, 0, 0],]def multiply(a: List[List[int]],…

网页版五子棋——匹配模块(客户端开发)

前一篇文章&#xff1a;网页版五子棋——用户模块&#xff08;客户端开发&#xff09;-CSDN博客 目录 前言 一、前后端交互接口设计 二、游戏大厅页面 1.页面代码编写 2.前后端交互代码编写 3.测试获取用户信息功能 结尾 前言 前面文章介绍完了五子棋项目用户模块的代码…

【微服务】不同微服务之间用户信息的获取和传递方案

如何才能在每个微服务中都拿到用户信息&#xff1f;如何在微服务之间传递用户信息&#xff1f; 文章目录 概述利用微服务网关做登录校验网关转微服务获取用户信息openFeign传递微服务之间的用户信息 概述 要在每个微服务中获取用户信息&#xff0c;可以采用以下几种方法&#…

OpenEuler 下 Docker 安装、配置与测试实例

文章目录 前言1. 环境准备2. 下载 Docker3.配置服务文件4.配置加速器加速下载docker镜像5. 验证 Docker 安装 前言 Docker 安装大致分为包管理器安装、脚本安装、离线手动安装、容器编排工具安装、桌面版安装等&#xff0c;每种安装各有特点&#xff0c;但涉及知识面不少&…