数据结构 栈和队列

目录

  • 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,一经查实,立即删除!

相关文章

2025年入门深度学习或人工智能,该学PyTorch还是TensorFlow?

随着2025应用人工智能和深度学习技术的举世泛气&#xff0c;还在迷茫于该选择哪个深度学习框架吗&#xff1f;PyTorch和TensorFlow是并立于深度学习世界两座巨塔&#xff0c;但是越来越多人发现&#xff0c;在2025年&#xff0c;PyTorch似乎比TensorFlow更为流行和被接受。下面…

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…

spring boot 难点解析及使用spring boot时的注意事项

1、难点解析&#xff1a; 1.1 配置管理&#xff1a; --- 尽管Spring Boot强调“习惯优于配置”&#xff0c;但在实际项目中&#xff0c;仍然需要面对大量的配置问题。如何合理地组织和管理这些配置&#xff0c;以确保项目的稳定性和可维护性&#xff0c;是一个挑战。 --- Sp…

鸿蒙系统:智能设备新时代的技术驱动

随着科技的不断进步&#xff0c;智能设备正在逐步改变我们的生活方式&#xff0c;从智能手机、智能穿戴设备到车载系统&#xff0c;再到智能家居&#xff0c;智能化的浪潮正席卷而来。而在这场变革中&#xff0c;鸿蒙系统&#xff08;HarmonyOS&#xff09;作为一款创新的操作系…

【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 …

PEF22554HTV3.1 英特尔intel 电信 IC 调帧器,线路接口单元(LIU) P-TQFP-144 在售20000PCS

PEF22554HTV3.1是一款由英特尔&#xff08;Intel&#xff09;生产的电信IC调帧器&#xff0c;它可以与线路接口单元&#xff08;LIU&#xff09;一起使用。该调帧器的封装类型是P-TQFP-144。该调帧器适用于电信领域的应用&#xff0c;可以用于实现数据调制和解调功能&#xff0…

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…

Java——反射机制详解

反射机制 什么是java的反射机制 反射是java的动态机制&#xff0c;可以在【程序运行期间】再确定如:对象实例化&#xff0c;方法调用&#xff0c;属性操作等 反射可以提高代码的灵活性&#xff0c;可扩展性&#xff0c;但是带来了较多的系统开销和较慢的运行效率反射机制不能…

LocalDate日期加减一天,mysql日期加减一天

在 Java 中&#xff0c;LocalDate 是不可变对象&#xff0c;意味着无法直接修改它的值。可以使用 plusDays(long daysToAdd) 方法来创建一个新的 LocalDate 实例&#xff0c;并将天数加到原始日期上。 在 lastHireDt 基础上加一天和加两天&#xff0c;代码如下&#xff1a; 加…

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

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

一个灵活且功能强大的动画库 Popmotion

一个灵活且功能强大的动画库 Popmotion 什么是 Popmotion&#xff1f; Popmotion 是一个强大的 JavaScript 动画库&#xff0c;提供了一系列简洁的 API&#xff0c;方便开发者创建流畅的动画效果。它支持不同类型的动画&#xff0c;包括 CSS 动画、SVG 动画和 DOM 动画&#…

【论文阅读】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…