【数据结构】 栈和队列
在计算机科学的世界里,数据结构是构建高效算法的基础。栈(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)作为两种基本且重要的数据结构,在软件开发、算法设计等众多领域都有着广泛的应用。今天,我们就来深入探讨一下栈和…...
微服务限流策略与性能优化全解析
一、服务瓶颈评估实例 1.1 背景介绍 本文我用我工作中实际的一个电商营销中台系统的订单服务来阐述。此微服务数据库采用 MySQL,配置为 8 核 32G。订单服务部署于一组服务器集群,考虑到高可用性,至少配置 3 个节点,每个节点服务…...
Windows环境搭建ES集群
搭建步骤 下载安装包 下载链接:https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.27-windows-x86_64.zip 解压 解压并复制出3份 es-node1配置 config/elasticsearch.yml cluster.name: xixi-es-win node.name: node-1 path.data: D:\\wor…...
qt中实现QListWidget列表
FR:徐海涛(hunkxu)...
大模型参数规模解析:32B中的“B“代表什么?如何影响AI性能?
以下是优化后的技术笔记整理,包含关键知识点解析和行业应用案例: 大模型参数规模解析:32B中的"B"代表什么?如何影响AI性能? 一、参数单位解读 B Billion(十亿):在AI模…...
Docker+Ollama+WebUI+AnythingLLM,构建企业本地AI大模型
文章目录 概要Ollama部署WebUI部署AnythingLLM部署Docker-Compose部署管理所有容器小结参考文章 概要 Ollama 是一个强大的大模型提供者,它通过开源的方式,为开发者和企业提供了先进的大型语言模型(LLM)。这些模型拥有处理和生成…...
【大模型】DeepSeek 高级提示词技巧使用详解
目录 一、前言 二、DeepSeek 通用提示词技巧 2.1 DeepSeek 通用提示词技巧总结 三、DeepSeek 进阶使用技巧 3.1 DeepSeek一个特定角色的人设 3.1.1 为DeepSeek设置角色操作案例一 3.1.2 为DeepSeek设置角色操作案例二 3.2 DeepSeek开放人设升级 3.2.1 特殊的人设&#…...
【玩转全栈】----Django基本配置和介绍
目录 Django基本介绍: Django基本配置: 安装Django 创建项目 创建app 注册app Django配置路由URL Django创建视图 启动项目 Django基本介绍: Django是一个开源的、基于Python的高级Web框架,旨在以快速、简洁的方式构建高质量的We…...
[Unity角色控制专题] (借助ai)详细解析官方第三人称控制器
首先模板链接在这里,你可以直接下载并导入unity即可查看官方为开发者写好一套控制器 本文的ai工具用到了豆包,其灵活程度很高,总结能力也强过我太多 因此大量使用,不喜勿喷 Starter Assets - ThirdPerson | Updates in new Charac…...
安装 Docker Desktop 修改默认安装目录到指定目录
Docker Desktop安装目录设置 Docker Desktop 默认安装位置 (C:\Program Files\Docker\Docker) 是这个 ,导致系统盘占用过大,大概2G ; 那么如何安装到其他磁盘呢? 根据docker desktop 官网 Docker Desktop install 我们可以看到&a…...
渗透测试--文件包含漏洞
文件包含漏洞 前言 《Web安全实战》系列集合了WEB类常见的各种漏洞,笔者根据自己在Web安全领域中学习和工作的经验,对漏洞原理和漏洞利用面进行了总结分析,致力于漏洞准确性、丰富性,希望对WEB安全工作者、WEB安全学习者能有所帮助…...
【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第十一节】
ISO 14229-1:2023 UDS诊断服务测试用例全解析(RequestTransferExit0x37服务) 作者:车端域控测试工程师 更新日期:2025年02月13日 关键词:UDS协议、0x37服务、传输终止、NRC验证、ISO 14229-1:2023 一、服务功能概述 0…...
虚拟环境测试部署应用
一、作用 虚拟环境(env)在计算机领域,特别是在软件开发和测试中扮演着重要角色。它主要用于创建一个隔离的环境,使得开发者可以在不影响系统其余部分的情况下安装、配置和运行软件项目。以下是虚拟环境的一些主要作用: 1、依赖管理 不同的项目可能需要不同版本的库或框…...
【线性代数】2矩阵
1.矩阵的运算 1.1.定义 矩阵行列式数表数行数和列数可以不相等行数和列数必须相等1.2.加法与数乘 矩阵的数乘:所有元素都乘这个数 矩阵的加法:对应位置处元素相加 🦊已知,求 1.3.乘法 矩阵乘法三步法 ①能不能乘:内定乘 ②乘完是何类型:外定型 ③中的元素是什么:左…...
前端为什么要使用new Promise包裹一个函数
在前端开发中,使用 new Promise 包裹一个函数主要是为了将原本不支持 Promise 规范的操作转化为支持 Promise 规范的操作,从而可以更好地处理异步操作,提升代码的可读性和可维护性。下面详细介绍这么做的常见原因和应用场景: 1. …...
深度学习在天文观测中的应用:解锁宇宙的奥秘
深度学习在天文观测中的应用:解锁宇宙的奥秘 引言 宇宙是无尽的,天文学家通过观测天体来揭示宇宙的奥秘。随着现代天文设备技术的进步,我们现在可以通过 射电望远镜、空间望远镜 和 地面望远镜 获取大量的天文数据。然而,这些数据的规模和复杂性让传统的手工分析方法变得…...
SaaS 平台开发要点
如何在 SaaS 平台的前端开发中,编写高性能、高质量且高度通用化的 Vue 组件 一、组件设计原则 单一职责原则:每个组件只负责一个核心功能受控/非受控模式:同时支持 v-model 和自主状态管理组合式 API:使用 Composition API 提升逻辑复用性可访问性:遵循 WAI-ARIA 规范Typ…...
python从入门到进去
python从入门到进去 第一章、软件和工具的安装一、安装 python 解释器二、安装 pycharm 第二章、初识 python一、注释可分三种二、打印输入语句三、变量1、基本数据类型1.1、整数数据类型 int1.2、浮点数数据类型 float1.3、布尔数据类型 boolean1.4、字符串数据类型 string 2、…...
DeepSeek与医院电子病历的深度融合路径:本地化和上云差异化分析
一、引言 1.1 研究背景与意义 在医疗信息化快速发展的当下,电子病历系统已成为医院信息管理的核心构成。电子病历(EMR)系统,是指医务人员在医疗活动过程中,使用医疗机构信息系统生成的文字、符号、图标、图形、数据、影像等数字化信息,并能实现存储、管理、传输和重现的…...
苍穹外卖day4 redis相关简单知识 店铺营业状态设置
内存存储 键值对 key-value 一般用于处理突发性大量请求数据操作(暂时浅显理解) 读写速度极快,常用于缓存数据,减少对数据库的访问压力,提高系统性能。例如,可以缓存用户会话、商品信息、页面数据 设置默…...
pycharm社区版有个window和arm64版本,到底下载哪一个?还有pycharm官网
首先pycharm官网是这一个。我是在2025年2月16日9:57进入的网站。如果网站还没有更新的话,那么就往下滑一下找到 community Edition,这个就是社区版了免费的。PyCharm:适用于数据科学和 Web 开发的 Python IDE 适用于数据科学和 Web 开发的 Python IDE&am…...
使用新版本golang项目中goyacc依赖问题的处理
背景 最近项目使用中有用到go mod 和 goyacc工具。goyacc涉及到编译原理的词法分析,文法分析等功能,可以用来生成基于golang的语法分析文件。本期是记录一个使用中遇到的依赖相关的问题。因为用到goyacc,需要生成goyacc的可执行文件。 而项目…...
Moya 网络框架
Moya 网络框架 通过 Moya 进行网络请求的一般步骤如下: 1. 定义 TargetType:为每个 API 请求创建一个枚举,遵循 TargetType 协议,指定基础 URL、请求路径、方法、参数等。 2. 创建 MoyaProvider:实例化 MoyaProvider&…...
FreeRTOS第3篇:链表的“精密齿轮”——列表与列表项
文章目录 1 列表与列表项:FreeRTOS的“排队系统”2 列表操作:FreeRTOS的“排队算法”3 列表的应用场景:FreeRTOS的“任务调度枢纽”4 源码级洞察:列表的“灵魂代码”5 实战:列表操作实验6 总结与思考引言:嵌入式系统的“任务候车厅” 想象你正在管理一座繁忙的火车站:乘…...
React.memo 使用详解与最佳实践
React.memo 使用详解与最佳实践 引言React.memo 是什么?使用场景实战示例示例解析自定义比较函数使用注意事项总结 引言 在 React 应用程序中,性能优化是一个永恒的话题。当父组件状态发生变化时,即使子组件的 props 没有改变,子…...
SpringBoot中集成SaToken
SpringBoot中集成SaToken 1. 写一个拦截器2. 对拦截器的说明&解释2. 拦截器 1. 写一个拦截器 import cn.dev33.satoken.exception.NotLoginException; import cn.dev33.satoken.stp.StpUtil; import org.springframework.beans.factory.annotation.Value; import org.spri…...
网络安全-攻击流程-应用层
应用层攻击针对OSI模型的第七层(应用层),主要利用协议漏洞、业务逻辑缺陷或用户交互弱点,直接威胁Web应用、API、数据库等服务。以下是常见应用层攻击类型及其流程,以及防御措施: 1. SQL注入(SQ…...
Ubuntu 24.04.1 LTS 本地部署 DeepSeek 私有化知识库
文章目录 前言工具介绍与作用工具的关联与协同工作必要性分析 1、DeepSeek 简介1.1、DeepSeek-R1 硬件要求 2、Linux 环境说明2.1、最小部署(Ollama DeepSeek)2.1.1、扩展(非必须) - Ollama 后台运行、开机自启: 2.2、…...
微信小程序中缓存数据全方位解惑
微信小程序中缓存数据全方位解惑 微信小程序中的数据缓存是提升用户体验和优化性能的重要手段,跟电脑浏览器中的Local Storage的性质一样。以下是关于微信小程序数据缓存的相关知识点和示例的详细介绍: 1. 数据缓存的类型 微信小程序提供了两种数据缓…...
python语言进阶之函数
目录 前言 函数的创建和调用 函数创建 调用函数 参数传递 形式参数和实际参数 位置参数 数量必须与定义时一致 位置必须与定义时一致 关键字参数 为参数设置默认值 可变参数 **parameter 返回值 变量的作用域 局部变量 全局变量 匿名函数 前言 提到函数&…...
