【队列】循环队列(Circular Queue)详解

【队列】循环队列(Circular Queue)详解

文章目录

一、循环队列简介

在实际开发中,队列是一种常用的数据结构,而循环队列(Circular Queue)则一般是一种基于数组实现的队列(也可使用循环链表)。与传统的 FIFO 队列相比,循环队列通过将数组首尾相连形成一个 “环”,能够更高效地利用内存空间。

循环队列的主要思想是:当队尾指针到达数组末端时,如果数组前面还有空余空间,就可以从数组头部重新利用这些空间进行入队操作。也就是说,数组的末端和头部通过逻辑上的连接,形成一个环状结构,从而避免了顺序队列中由于出队操作而导致的空间浪费问题。

如下图就是一个典型的循环队列,其中的 front 表示头指针,指向队头。rear 则表示尾指针,指向队尾元素的下一个位置。

请添加图片描述

二、循环队列的判空和判满

在循环队列中,frontrear 都是可以循环移动的,当队空时,front == rear 成立;当队满时,front == rear 也成立。因此显然不能只凭 front == rear 来判断队空还是队满。

为了解决这个问题,在循环队列中约定:少用一个元素空间,当队尾标识的 rear在队头标识front 的上一个位置时,队列为满。此时,判断队空和队满的条件分别如下:

队空时:front == rear

队满时:(rear + 1) % MAXSIZE == front

其中,MAXSIZE 是队列容量的大小

两种情况下队列中指针的状态如下图所示:

请添加图片描述

既然少一个元素空间,这就意味着,如果要存储的数据个数最大为 k,那么你需要开辟的循环队列的大小应为 k+1

三、循环队列的实现

我们来以具体的一道题目来实现循环队列的各种操作

leetcode 622. 设计循环队列

typedefstruct{int* a;int front;// 头“指针”指向队头数据int tail;// 尾“指针”指向队尾的下一个位置int k;// 一会儿开辟的队列大小为 k+1} MyCircularQueue; bool myCircularQueueIsEmpty(MyCircularQueue* obj); bool myCircularQueueIsFull(MyCircularQueue* obj);// 前面先实现的函数要用到这两个接口,所以事先声明一下// 循环队列的初始化 MyCircularQueue*myCircularQueueCreate(int k){ MyCircularQueue* cq =(MyCircularQueue*)malloc(sizeof(MyCircularQueue)); cq->a =(int*)malloc(sizeof(int)*(k+1)); cq->front =0;// 初始化数据 cq->tail =0; cq->k = k;return cq;}// 入队 bool myCircularQueueEnQueue(MyCircularQueue* obj,int value){if(myCircularQueueIsFull(obj))return false;// 满了就不能再入了 obj->a[obj->tail]= value;// 将数据入进来++obj->tail;// 更新tail obj->tail %=(obj->k+1);// tail 自增了之后可能超出循环队列的大小范围所以要取模// 模的是循环队列的大小 k+1return true;}// 出队 bool myCircularQueueDeQueue(MyCircularQueue* obj){if(myCircularQueueIsEmpty(obj))return false;// 为空就不能再删 obj->front =(obj->front+1)%(obj->k+1);// 和前面是一样的原理,注意同样是加一再取模return true;}// 获取队头元素intmyCircularQueueFront(MyCircularQueue* obj){if(myCircularQueueIsEmpty(obj))return-1;return obj->a[obj->front];}// 获取队尾元素intmyCircularQueueRear(MyCircularQueue* obj){if(myCircularQueueIsEmpty(obj))return-1;if(obj->tail ==0)return obj->a[obj->k];// 跨越了一个循环的情况elsereturn obj->a[obj->tail-1];}// 判空 bool myCircularQueueIsEmpty(MyCircularQueue* obj){return obj->front == obj->tail;}// 判满 bool myCircularQueueIsFull(MyCircularQueue* obj){return(obj->tail+1)%(obj->k+1)== obj->front;// tail的后一个是front说明满了,但是有可能tail+1跨过了一个循环。所以要取模}// 释放voidmyCircularQueueFree(MyCircularQueue* obj){free(obj->a);// 注意这里要先释放结构体内的数组!!!不然会可能内存泄漏free(obj);}

Read more

Gemini cli 源码分析之工具篇-WebFetch工具

Gemini cli 源码分析之工具篇-WebFetch工具

查看完整的Gemini cli 源码分析系列课程 Gemini CLI源码启示录:AI工程师必须掌握的终端开发范式 WebFetch工具深度分析 概述 WebFetch工具 (packages/core/src/tools/web-fetch.ts) 是Gemini CLI项目中的一个核心工具,用于从URL获取和处理网页内容。该工具结合了AI能力和传统网页抓取技术,提供了智能的内容获取和处理功能。 核心架构 主要组件 WebFetchTool(主工具类) ├── WebFetchToolInvocation(工具调用实现) ├── parsePrompt(URL解析函数) └── GroundingMetadata(引用和元数据接口) 继承关系 * WebFetchTool 继承自 BaseDeclarativeTool<WebFetchToolParams, ToolResult> * WebFetchToolInvocation 继承自 BaseToolInvocation<WebFetchToolParams, ToolResult> 核心功能分析

深度拆解 OpenClaw:从架构原理到落地实战,吃透 AI Agent 执行网关的底层逻辑

深度拆解 OpenClaw:从架构原理到落地实战,吃透 AI Agent 执行网关的底层逻辑

❝ 本文所有核心内容均来自OpenClaw官方GitHub仓库、架构白皮书及官方文档,确保100%准确、零主观臆断;兼顾入门可读性与资深开发者的深度需求,从底层逻辑到实战落地全链路覆盖。 官方权威来源:OpenClaw GitHub仓库 | 官方架构文档 | 官方文档中心 一、开篇:OpenClaw到底是什么?—— 打破AI“能说不能做”的核心范式 1.1 官方权威定义 OpenClaw(曾用名Clawdbot、Moltbot)是一款基于MIT开源协议、本地优先的自托管AI Agent执行网关,由奥地利独立开发者Peter Steinberger(PSPDFKit创始人)发起并主导开发,核心定位是连接大语言模型(LLM)、通讯渠道与系统工具的中枢桥梁,让AI从“对话建议者”升级为“自主执行者”,实现自然语言指令到端到端任务落地的全闭环。 通俗来讲:ChatGPT、Claude等传统对话式AI,只能给你“做事的步骤清单”;而OpenClaw能听懂你的自然语言指令,直接调用大模型做决策、操作你的设备/系统/软件,把事情做完,

AI+Decodo:构建智能电商价格监控系统的完整实战指南

AI+Decodo:构建智能电商价格监控系统的完整实战指南

在现代电商环境中,价格监控已成为商家和消费者的刚需。然而传统的网页爬虫面临着反爬虫机制越来越严格、网页结构复杂多变、IP被封禁等诸多挑战。本文将详细介绍如何结合AI智能分析与高质量代理池,构建一个既稳定又智能的电商价格监控系统。 一、技术背景与挑战分析 1.1 传统爬虫的痛点 现代电商网站的反爬虫机制日趋完善,传统爬虫面临以下核心挑战: * 网络访问层面的严格限制:IP 频繁访问被封禁、User-Agent 识别与拦截,导致数据获取困难。 * 页面结构的动态复杂性:动态 JavaScript 渲染内容、页面结构频繁变更,传统静态解析方式已无法适应。 * 数据提取的多样性挑战:价格格式千变万化、库存状态表达不统一,不同平台数据呈现差异大,需更智能的识别能力。 不同平台的数据呈现方式差异巨大,需要更智能的识别和解析能力。 1.2 解决方案架构 为了解决这些问题,我们设计了一个"AI + 代理池"的智能抓取架构: [目标网站] ← [高质量代理池] ← [智能请求管理] ← [AI内容分析] ← [结构化输出] 核心设计思路: * 代理池负责网络身份管理,

【征文计划】基于Rokid 眼镜 的AI天气应用+GPS定位+AI旅游规划

【征文计划】基于Rokid 眼镜 的AI天气应用+GPS定位+AI旅游规划

文章目录 * 本文选用的技术包括: * 一、主要流程 * 新增三个辅助类,原有文件做对应改造: * 二、功能 A:GPS 自动定位 * 2.1 实现路径 * 2.2 核心代码:LocationHelper.kt * 2.3 意图识别:我们添加 GPS 的关键词 * 三、功能 B:对话上下文工程 * 3.1 核心数据结构 * 3.2 续播意图的两种形态 * 四、功能 C:AI 旅游规划 * 4.1 为什么用 LLM, 而不是规则 * 4.2 核心代码:AiTravelPlanHelper.kt