【数据结构】 栈和队列
在计算机科学的世界里,数据结构是构建高效算法的基础。栈(Stack)和队列(Queue)作为两种基本且重要的数据结构,在软件开发、算法设计等众多领域都有着广泛的应用。今天,我们就来深入探讨一下栈和队列的奥秘。
1.栈(后进先出)
1.1栈的基本概念和结构
栈是一种遵循后进先出(Last In First Out,LIFO)原则的数据结构。想象一下一摞盘子,你只能从最上面拿走盘子,也只能把新盘子放在最上面。栈就类似这摞盘子,最后放入栈中的元素会最先被取出。

1.2栈的操作
- 入栈(Push):将一个元素添加到栈的顶部。这就好比在一摞盘子的最上面再放一个盘子。
- 出栈(Pop):移除并返回栈顶部的元素。相当于从一摞盘子中拿走最上面的那个盘子。
- 查看栈顶元素(Peek):返回栈顶部的元素,但不移除它。
- 判断栈是否为空(isEmpty):检查栈中是否有元素。
1.3栈的实现
栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些,因为数组在尾上插入数据的代价比较小。
#include <stdio.h>
#include <stdlib.h>#define MAX_SIZE 100// 定义栈结构体
typedef struct {int items[MAX_SIZE];int top;
} Stack;// 初始化栈
void initStack(Stack* s) {s->top = -1;
}// 判断栈是否为空
int isEmpty(Stack* s) {return s->top == -1;
}// 判断栈是否已满
int isFull(Stack* s) {return s->top == MAX_SIZE - 1;
}// 入栈操作
void push(Stack* s, int item) {if (isFull(s)) {printf("栈已满,无法入栈!\n");return;}s->items[++(s->top)] = item;
}// 出栈操作
int pop(Stack* s) {if (isEmpty(s)) {printf("栈为空,无法出栈!\n");return -1;}return s->items[(s->top)--];
}// 查看栈顶元素
int peek(Stack* s) {if (isEmpty(s)) {printf("栈为空,无栈顶元素!\n");return -1;}return s->items[s->top];
}int main() {Stack s;initStack(&s);push(&s, 10);push(&s, 20);push(&s, 30);printf("栈顶元素: %d\n", peek(&s));printf("出栈元素: %d\n", pop(&s));printf("出栈后栈顶元素: %d\n", peek(&s));return 0;
}
- 栈结构体:定义了一个包含数组
items和栈顶指针top的结构体Stack。 - 初始化栈:
initStack函数将栈顶指针初始化为 -1,表示栈为空。 - 判断栈状态:
isEmpty函数判断栈是否为空,isFull函数判断栈是否已满。 - 入栈操作:
push函数在栈未满时将元素添加到栈顶。 - 出栈操作:
pop函数在栈不为空时移除并返回栈顶元素。 - 查看栈顶元素:
peek函数在栈不为空时返回栈顶元素。
2.队列(先进后出)
2.1队列的概念和结构

2.2队列的操作
- 入队(Enqueue):将一个元素添加到队列的尾部。类似于在排队的末尾加入一个人。
- 出队(Dequeue):移除并返回队列头部的元素。就像排队的第一个人买到票后离开队伍。
- 查看队头元素(Peek):返回队列头部的元素,但不移除它。
- 判断队列是否为空(isEmpty):检查队列中是否有元素。
2.3队列的实现
#include <stdio.h>
#include <stdlib.h>#define MAX_SIZE 100// 定义队列结构体
typedef struct {int items[MAX_SIZE];int front;int rear;
} Queue;// 初始化队列
void initQueue(Queue *q) {q->front = 0;q->rear = -1;
}// 判断队列是否为空
int isEmptyQueue(Queue *q) {return q->rear < q->front;
}// 判断队列是否已满
int isFullQueue(Queue *q) {return q->rear == MAX_SIZE - 1;
}// 入队操作
void enqueue(Queue *q, int item) {if (isFullQueue(q)) {printf("队列已满,无法入队!\n");return;}q->items[++(q->rear)] = item;
}// 出队操作
int dequeue(Queue *q) {if (isEmptyQueue(q)) {printf("队列为空,无法出队!\n");return -1;}return q->items[(q->front)++];
}// 查看队头元素
int peekQueue(Queue *q) {if (isEmptyQueue(q)) {printf("队列为空,无队头元素!\n");return -1;}return q->items[q->front];
}int main() {Queue q;initQueue(&q);enqueue(&q, 10);enqueue(&q, 20);enqueue(&q, 30);printf("队头元素: %d\n", peekQueue(&q));printf("出队元素: %d\n", dequeue(&q));printf("出队后队头元素: %d\n", peekQueue(&q));return 0;
}
- 队列结构体:定义了一个包含数组
items、队头指针front和队尾指针rear的结构体Queue。 - 初始化队列:
initQueue函数将队头指针初始化为 0,队尾指针初始化为 -1。 - 判断队列状态:
isEmptyQueue函数判断队列是否为空,isFullQueue函数判断队列是否已满。 - 入队操作:
enqueue函数在队列未满时将元素添加到队尾。 - 出队操作:
dequeue函数在队列不为空时移除并返回队头元素。 - 查看队头元素:
peekQueue函数在队列不为空时返回队头元素。
相关文章:
【数据结构】 栈和队列
在计算机科学的世界里,数据结构是构建高效算法的基础。栈(Stack)和队列(Queue)作为两种基本且重要的数据结构,在软件开发、算法设计等众多领域都有着广泛的应用。今天,我们就来深入探讨一下栈和…...
AI视频创作教程:如何用AI让古画动起来。
事情缘由: 如果是简单的图,找原图直接写提示词即可。 如果碰到多人多活动的图,直接出的效果会很不好,那么该怎么做呢? 图片分模块 首先,复杂部分的图,把长图分多个模块。 比如这张图࿰…...
撕碎QT面具(1):Tab Widget转到某个Tab页
笔者未系统学过C语法,仅有Java基础,具体写法仿照于大模型以及其它博客。自我感觉,如果会一门对象语言,没必要先刻意学C,因为自己具有对象语言的基础,等需要用什么再学也不迟。毕竟不是专门学C去搞算法。 1…...
DeepSeek24小时写作机器人,持续创作高质量文案
内容创作已成为企业、自媒体和创作者的核心竞争力。面对海量的内容需求,人工创作效率低、成本高、质量参差不齐等问题日益凸显。如何在有限时间内产出高质量内容?DeepSeek写作机器人,一款24小时持续创作的智能工具,为企业和个人提…...
npm安装依赖(npm install)时遇到认证错误的解决方案
问题描述 在使用 npm install 安装依赖时遇到以下错误: npm error code E401 npm error Incorrect or missing password.解决方案 方案一:使用淘宝(或其它国内公共)镜像(如果已经是淘宝镜像跳过此步) 设…...
SpringBoot+微信小程序+数据可视化的宠物到家喂宠服务(程序+论文+讲解+安装+调试+售后等)
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,我会一一回复,希望帮助更多的人。 系统介绍 在经济高速发展、物质生活极大丰富的当下,人们的精神需求愈发凸显࿰…...
免费大模型网站
腾讯元宝 腾讯元宝 秘塔搜索 秘塔搜索 超算互联网 超算互联网回答速度很慢 Chatbot Arena Chatbot Arena 大模型竞技场。...
OpenCV的主要模块
OpenCV的模块...
使用 Python 爬虫和 FFmpeg 爬取 B 站高清视频
以下是一个完整的 Python 爬虫代码示例,用于爬取 B 站视频并使用 FFmpeg 合成高清视频。 1. 准备工作 确保安装了以下 Python 库和工具: bash复制 pip install requests moviepy2. 爬取视频和音频文件 B 站的视频和音频文件通常是分开存储的&#x…...
Retrieval-Augmented Generation for LargeLanguage Models: A Survey
标题:Retrieval-Augmented Generation for Large Language Models: A Survey 作者:Yunfan Gaoa , Yun Xiongb , Xinyu Gaob , Kangxiang Jiab , Jinliu Panb , Yuxi Bic , Yi Daia , Jiawei Suna , Meng Wangc , and Haofen Wang 1. By referencing ext…...
2025年2月16日(numpy-deepseek)
嗯,用户让我介绍一下这段使用numpy的代码。首先,我需要确认用户的需求是什么。他们可能刚开始学习Python或者数据科学,所以需要基础的解释。让我仔细看一下代码。 第一行是import numpy as np,这应该是导入numpy库,并…...
C#windows窗体人脸识别
一、创建一个数据库,名为TestFaceDB 里面有一张表就OK了,表名Users,表里面有几个字段我说明一下: id--------------------bigint----------------------编号 name--------------varchar(50)-----------------用户名 phone--------------v…...
【第11章:生成式AI与创意应用—11.1 文本生成与创意写作辅助的实现与优化】
凌晨三点的书房,作家李明第27次删除了刚写好的段落。窗外路灯在稿纸上投下斑驳光影,就像他此刻支离破碎的创作灵感。突然,写作软件弹出提示:"检测到情感转折生硬,建议尝试’雨夜独白’场景模板?"这个由生成式AI驱动的建议,不仅拯救了濒临崩溃的章节,更揭开了…...
【Elasticsearch】通过运行时字段在查询阶段动态覆盖索引字段
在 Elasticsearch 中,Override field values at query time是指通过运行时字段(runtime fields)在查询阶段动态覆盖索引字段的值,而无需修改原始索引数据。这种功能特别适用于以下场景: 1. 动态修改字段值:…...
电解电容的参数指标
容量 这个值通常是室温25℃,在一定频率和幅度的交流信号下测得的容量。容量会随着温度、直流电压、交流电压值的变化而改变。 额定电压 施加在电容上的最大直流电压,通常要求降额使用。 例如额定电压是4V,降额到70%使用,最高施…...
linux 内核编译报错 unknown assembler invoked
在编译内核时,出现如下错误 : scripts/gcc-wrapper.py aarch64-linux-gnu-gcc: unknown assembler invoked scripts/Kconfig.include:47: Sorry, this assembler is not supported. make[1]: *** [scripts/kconfig/Makefile:29:menuconfig] 错误 1 make…...
HTML,API,RestFul API基础
一文搞懂RESTful API - bigsai - 博客园 1. API 路径 开头必须 /,表示绝对路径,不支持 . 或 ..(相对路径)。API 结尾 / 通常不需要,但部分框架会自动处理 / → 无 /。 ✅ 推荐 GET /api/v1/products # 资源集合…...
js 使用缓存判断在规定时间内显示一次弹框
js 使用缓存判断在规定时间内显示一次弹框 功能拆分,新用户注册完成登录跳转首页 , js根据注册时间判断显示一个新手指引的弹窗,只在注册当天登录且显示一次 <script>jQuery(document).ready(function($) {getWinnerModalShow()});// 新…...
使用新版本golang项目中goyacc依赖问题的处理
背景 最近项目使用中有用到go mod 和 goyacc工具。goyacc涉及到编译原理的词法分析,文法分析等功能,可以用来生成基于golang的语法分析文件。本期是记录一个使用中遇到的依赖相关的问题。因为用到goyacc,需要生成goyacc的可执行文件。 而项目…...
洛谷 P2574 XOR的艺术/CF242E XOR on Segment 题解
1.XOR的艺术 题意 给定一个长度为 n n n的、只含有数字 0 , 1 0,1 0,1的字符串和两种操作。 对于每种操作,给定 o p , l , r op,l,r op,l,r: o p 0 op0 op0表示将字符串的 [ l , r ] [l, r] [l,r]区间内的 0 0 0变成 1 1 1, 1 1 1变成 0 …...
从DDR4引脚信号到PCB布线实战:避开这些坑,你的硬件稳定性提升一个等级
DDR4硬件设计实战:信号完整性与PCB布线避坑指南 在高速数字电路设计中,DDR4内存接口堪称硬件工程师的"终极考场"。当数据速率突破3200Mbps时,那些在低速设计中可以忽略的寄生参数突然变成了系统稳定性的致命杀手。本文将揭示DDR4设…...
深度学习数据增强框架AugmentNew:模块化设计与实战应用解析
1. 项目概述与核心价值最近在折腾一些数据增强的活儿,发现了一个挺有意思的仓库,叫alltobebetter/AugmentNew。这名字起得挺直白,“一切为了更好”,核心就是搞数据增强的。数据增强这玩意儿,在机器学习,尤其…...
Apache Airflow 系列教程 | 第6课:DAG 解析与处理引擎
导读(Introduction) 欢迎来到 Apache Airflow 源码深度解析系列的第六课。 在前一课中,我们深入剖析了 Scheduler 的核心原理——它如何在循环中创建 DagRun、推进任务状态、将任务入队给 Executor。但 Scheduler 能调度 DAG 的前提是:系统必须先"看到"这些 DA…...
视频分析终极指南:如何用AI智能解析视频内容,让机器看懂视频
视频分析终极指南:如何用AI智能解析视频内容,让机器看懂视频 【免费下载链接】video-analyzer Analyze videos using LLMs, Computer Vision and Automatic Speech Recognition 项目地址: https://gitcode.com/gh_mirrors/vi/video-analyzer 你是…...
Mac OS X 环境下通过 HoRNDIS 实现 Android USB 网络共享的专业部署与优化指南
Mac OS X 环境下通过 HoRNDIS 实现 Android USB 网络共享的专业部署与优化指南 【免费下载链接】HoRNDIS Android USB tethering driver for Mac OS X 项目地址: https://gitcode.com/gh_mirrors/ho/HoRNDIS 在 macOS 系统生态中,实现 Android 设备的有线网络…...
VScode安装后,如果修改中文版本? 坑是啥?
1 就是安装后,按照网上方法没有中文版本出来。结果测试好几次都不行,,,坑货啊。重新卸载插件后,重新安装,提示就有了。改变语言并且重启。才成功了。搞了半小时才出来, 为了这个。...
修改_IO_2_1_stdout_的某些值来泄漏libc基地址
主要的原理可以去 https://blog.detectivelfy.top/2022/04/16/IO-FILE%E4%B9%8B%E5%88%A9%E7%94%A8stdout%E6%B3%84%E9%9C%B2libc%E5%9C%B0%E5%9D%80/ 看我们只讲实操 ✍内容 这里有两个方法 我们使用楚慧杯2024的ez_heap2作为例题 重要的代码审计 很清楚没有show函数 看的…...
5步掌握TIDAL无损音乐下载:tidal-dl-ng专业工具终极指南
5步掌握TIDAL无损音乐下载:tidal-dl-ng专业工具终极指南 【免费下载链接】tidal-dl-ng TIDAL Media Downloader Next Generation! Up to HiRes / TIDAL MAX 24-bit, 192 kHz. 项目地址: https://gitcode.com/gh_mirrors/ti/tidal-dl-ng 想要在TIDAL平台上获取…...
RAG进阶:下一代RAG怎么玩?
基础RAG能解决80%的问题,但剩下20%的难题,需要更进阶的技术。一、基础RAG碰到了什么天花板 基础RAG的套路很简单:文档切块 → Embedding → 向量检索 → 拼接Prompt → 大模型生成答案。 简单场景够用,但往深了用,三个…...
医疗大语言模型微调实战:基于CareGPT构建专业AI助手
1. 项目概述与核心价值如果你正在寻找一个能让你亲手构建、微调并部署一个专业级医疗大语言模型的完整开源方案,那么CareGPT(原名CareLlama)这个项目,绝对值得你花上几个小时深入研究。我最初接触这个项目,是因为团队内…...
