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

【数据结构】 栈和队列

        在计算机科学的世界里,数据结构是构建高效算法的基础。栈(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;
}
  1. 栈结构体:定义了一个包含数组 items 和栈顶指针 top 的结构体 Stack
  2. 初始化栈initStack 函数将栈顶指针初始化为 -1,表示栈为空。
  3. 判断栈状态isEmpty 函数判断栈是否为空,isFull 函数判断栈是否已满。
  4. 入栈操作push 函数在栈未满时将元素添加到栈顶。
  5. 出栈操作pop 函数在栈不为空时移除并返回栈顶元素。
  6. 查看栈顶元素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;
}
  1. 队列结构体:定义了一个包含数组 items、队头指针 front 和队尾指针 rear 的结构体 Queue
  2. 初始化队列initQueue 函数将队头指针初始化为 0,队尾指针初始化为 -1。
  3. 判断队列状态isEmptyQueue 函数判断队列是否为空,isFullQueue 函数判断队列是否已满。
  4. 入队操作enqueue 函数在队列未满时将元素添加到队尾。
  5. 出队操作dequeue 函数在队列不为空时移除并返回队头元素。
  6. 查看队头元素peekQueue 函数在队列不为空时返回队头元素。

相关文章:

【数据结构】 栈和队列

在计算机科学的世界里&#xff0c;数据结构是构建高效算法的基础。栈&#xff08;Stack&#xff09;和队列&#xff08;Queue&#xff09;作为两种基本且重要的数据结构&#xff0c;在软件开发、算法设计等众多领域都有着广泛的应用。今天&#xff0c;我们就来深入探讨一下栈和…...

AI视频创作教程:如何用AI让古画动起来。

事情缘由&#xff1a; 如果是简单的图&#xff0c;找原图直接写提示词即可。 如果碰到多人多活动的图&#xff0c;直接出的效果会很不好&#xff0c;那么该怎么做呢&#xff1f; 图片分模块 首先&#xff0c;复杂部分的图&#xff0c;把长图分多个模块。 比如这张图&#xff0…...

撕碎QT面具(1):Tab Widget转到某个Tab页

笔者未系统学过C语法&#xff0c;仅有Java基础&#xff0c;具体写法仿照于大模型以及其它博客。自我感觉&#xff0c;如果会一门对象语言&#xff0c;没必要先刻意学C&#xff0c;因为自己具有对象语言的基础&#xff0c;等需要用什么再学也不迟。毕竟不是专门学C去搞算法。 1…...

DeepSeek24小时写作机器人,持续创作高质量文案

内容创作已成为企业、自媒体和创作者的核心竞争力。面对海量的内容需求&#xff0c;人工创作效率低、成本高、质量参差不齐等问题日益凸显。如何在有限时间内产出高质量内容&#xff1f;DeepSeek写作机器人&#xff0c;一款24小时持续创作的智能工具&#xff0c;为企业和个人提…...

npm安装依赖(npm install)时遇到认证错误的解决方案

问题描述 在使用 npm install 安装依赖时遇到以下错误&#xff1a; npm error code E401 npm error Incorrect or missing password.解决方案 方案一&#xff1a;使用淘宝&#xff08;或其它国内公共&#xff09;镜像&#xff08;如果已经是淘宝镜像跳过此步&#xff09; 设…...

SpringBoot+微信小程序+数据可视化的宠物到家喂宠服务(程序+论文+讲解+安装+调试+售后等)

感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望帮助更多的人。 系统介绍 在经济高速发展、物质生活极大丰富的当下&#xff0c;人们的精神需求愈发凸显&#xff0…...

免费大模型网站

腾讯元宝 腾讯元宝 秘塔搜索 秘塔搜索 超算互联网 超算互联网回答速度很慢 Chatbot Arena Chatbot Arena 大模型竞技场。...

OpenCV的主要模块

OpenCV的模块...

使用 Python 爬虫和 FFmpeg 爬取 B 站高清视频

以下是一个完整的 Python 爬虫代码示例&#xff0c;用于爬取 B 站视频并使用 FFmpeg 合成高清视频。 1. 准备工作 确保安装了以下 Python 库和工具&#xff1a; bash复制 pip install requests moviepy2. 爬取视频和音频文件 B 站的视频和音频文件通常是分开存储的&#x…...

Retrieval-Augmented Generation for LargeLanguage Models: A Survey

标题&#xff1a;Retrieval-Augmented Generation for Large Language Models: A Survey 作者&#xff1a;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)

嗯&#xff0c;用户让我介绍一下这段使用numpy的代码。首先&#xff0c;我需要确认用户的需求是什么。他们可能刚开始学习Python或者数据科学&#xff0c;所以需要基础的解释。让我仔细看一下代码。 第一行是import numpy as np&#xff0c;这应该是导入numpy库&#xff0c;并…...

C#windows窗体人脸识别

一、创建一个数据库&#xff0c;名为TestFaceDB 里面有一张表就OK了&#xff0c;表名Users,表里面有几个字段我说明一下&#xff1a; id--------------------bigint----------------------编号 name--------------varchar(50)-----------------用户名 phone--------------v…...

【第11章:生成式AI与创意应用—11.1 文本生成与创意写作辅助的实现与优化】

凌晨三点的书房,作家李明第27次删除了刚写好的段落。窗外路灯在稿纸上投下斑驳光影,就像他此刻支离破碎的创作灵感。突然,写作软件弹出提示:"检测到情感转折生硬,建议尝试’雨夜独白’场景模板?"这个由生成式AI驱动的建议,不仅拯救了濒临崩溃的章节,更揭开了…...

【Elasticsearch】通过运行时字段在查询阶段动态覆盖索引字段

在 Elasticsearch 中&#xff0c;Override field values at query time是指通过运行时字段&#xff08;runtime fields&#xff09;在查询阶段动态覆盖索引字段的值&#xff0c;而无需修改原始索引数据。这种功能特别适用于以下场景&#xff1a; 1. 动态修改字段值&#xff1a…...

电解电容的参数指标

容量 这个值通常是室温25℃&#xff0c;在一定频率和幅度的交流信号下测得的容量。容量会随着温度、直流电压、交流电压值的变化而改变。 额定电压 施加在电容上的最大直流电压&#xff0c;通常要求降额使用。 例如额定电压是4V&#xff0c;降额到70%使用&#xff0c;最高施…...

linux 内核编译报错 unknown assembler invoked

在编译内核时&#xff0c;出现如下错误 : 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&#xff1a;menuconfig] 错误 1 make…...

HTML,API,RestFul API基础

一文搞懂RESTful API - bigsai - 博客园 1. API 路径 开头必须 /&#xff0c;表示绝对路径&#xff0c;不支持 . 或 ..&#xff08;相对路径&#xff09;。API 结尾 / 通常不需要&#xff0c;但部分框架会自动处理 / → 无 /。 ✅ 推荐 GET /api/v1/products # 资源集合…...

js 使用缓存判断在规定时间内显示一次弹框

js 使用缓存判断在规定时间内显示一次弹框 功能拆分&#xff0c;新用户注册完成登录跳转首页 &#xff0c; js根据注册时间判断显示一个新手指引的弹窗&#xff0c;只在注册当天登录且显示一次 <script>jQuery(document).ready(function($) {getWinnerModalShow()});// 新…...

使用新版本golang项目中goyacc依赖问题的处理

背景 最近项目使用中有用到go mod 和 goyacc工具。goyacc涉及到编译原理的词法分析&#xff0c;文法分析等功能&#xff0c;可以用来生成基于golang的语法分析文件。本期是记录一个使用中遇到的依赖相关的问题。因为用到goyacc&#xff0c;需要生成goyacc的可执行文件。 而项目…...

洛谷 P2574 XOR的艺术/CF242E XOR on Segment 题解

1.XOR的艺术 题意 给定一个长度为 n n n的、只含有数字 0 , 1 0,1 0,1的字符串和两种操作。 对于每种操作&#xff0c;给定 o p , l , r op,l,r op,l,r&#xff1a; o p 0 op0 op0表示将字符串的 [ l , r ] [l, r] [l,r]区间内的 0 0 0变成 1 1 1&#xff0c; 1 1 1变成 0 …...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...