循环队列的实现

news2025/8/6 22:27:24

我们知道队列的实现可以用单链表和数组,但是循环链表也可以使用这两种方式。

首先我们来看看单链表:

首先使用单链表,我们需要考虑循环队列的一些特点。

单链表实现循环队列我们要考虑几个核心问题:

首先我们要区别 解决 空 和 满 的问题。多加一个空间,或者加一个size变量来记录。

当front==rail时,为空。

当rail->next == front时为满

其次,我们需要解决如何 能取出队尾的数据。对于单链表,因为我们rail指向队尾的后一个,所以不好取出队尾数据

数组来实现 循环链表:

同样当front==rail时,为空

当 front == (rail+1)%(k+1)时为满

数组解决循环链表,我们要考虑到:当不断出队和入队时如何循环起来?

可以使用if语句来判断,也可以给让rail超出数组大小后,直接回到数组开头。

当rail在第一个位置时,如何找到队尾元素呢?

我们可以使用if,也可以(rail+k)%(k+1)来取到前一个元素。

#include<stdio.h>
#include<assert.h>
#include<stdbool.h>

typedef struct {
    int* a;
    int front;
    int rail;
    int k;
}MyQueue;

MyQueue* MyQueueCreat(int k)
{
    MyQueue* obj = (MyQueue*)malloc(sizeof(MyQueue));
    obj->a = (int*)malloc(sizeof(int) * (k + 1));
    obj->front = obj->rail = 0;
    obj->k = k;
}
bool isMyQueueEmtp(MyQueue* obj)
{
    assert(obj);
    if (obj->front == obj->rail)
        return true;
    return false;
}
bool isMyQueueFull(MyQueue* obj)
{
    assert(obj);
    return (obj->rail + 1) % (obj->k + 1) == obj->front;
}
bool MyQueueEn(MyQueue* obj, int value)
{
    assert(obj);
    if (isMyQueueFull(obj))
        return -1;
    obj->a[obj->rail++] = value;
    obj->rail %= obj->k + 1;
}
bool MyQueueOut(MyQueue* obj)
{
    assert(obj);
    obj->front++;
    obj->front %= obj->k + 1;

}

int MyQueueFront(MyQueue* obj)
{
    assert(obj);
    return obj->a[obj->front];
}
int MyQueueRail(MyQueue* obj)
{
    asert(obj);
    if (isMyQueueEmtp(obj))
        return - 1;
    return obj->a[obj->rail + obj->k % obj->k + 1];
}

void MyQueueFree(MyQueue* obj)
{
    assert(obj);
    free(obj->a);
    free(obj);
}

好的,今天的复习就到这里

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/394056.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一文吃透 SpringMVC 中的转发和重定向

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

CameraLink备忘录

首先来看看MDR26的引脚定义 从正面看进去&#xff0c;插头端&#xff0c;放置成倒梯形。 上排&#xff0c;从左到右&#xff0c;1到13&#xff0c; 下排&#xff0c;从左到右&#xff0c;14到26. 插座端&#xff0c;是镜像对称关系。 从正面看进去&#xff0c;插座端&#xf…

C#开发的OpenRA的游戏主界面怎么样创建4

继续游戏主界面创建的主题, 前面已经说到怎么样找到mainmenu.yaml来显示主界面,也说了怎么样找到各个子控件类。 现在就来仔细分析一下,主界面每一部分的功能。 比如下面这个区域的界面是怎么样创建: 要创建这一小部分的界面显示,也是需要做很多的工作。 因为在这里所有UI…

乐鑫特权隔离机制 #4 | 用户应用程序的安全启动

乐鑫特权隔离机制 系列文章 #4 目录 安全启动 (Secure boot) 受保护应用程序的安全启动 (Secure boot for protected app ) 用户应用程序的安全启动 (Secure boot for user app) 基于证书的验证方案 (Certificate-based verification scheme) 必要条件验证过程​​​​​…

数据模型(上):模型分类和模型组成

1.模型分类 ​ 数据模型是一种由符号、文本组成的集合,用以准确表达信息景观,达到有效交流、沟通的目的。数据建模者要求能与来自不同部门,具有不同技术背景,不同业务经验,不同技术水平的人员交流、沟通。数据建模者要了解每个人员的观点,并通过反馈证明理解无误,最终作…

【Java】Java环开发环境安装

Java环开发环境安装 简介&#xff1a; 如果要从事Java编程&#xff0c;则需要安装JDK&#xff0c;如果仅仅是运行一款Java程序则JRE就满足要求。 Java的安装包分为两类 一类是JRE其就是一个独立的Java运行环境&#xff1b; 一类是JDK其是Java的开发环境&#xff0c;不过在JDK…

软件设计师教程(九)计算机系统知识-软件工程基础知识

软件设计师教程 软件设计师教程&#xff08;一&#xff09;计算机系统知识-计算机系统基础知识 软件设计师教程&#xff08;二&#xff09;计算机系统知识-计算机体系结构 软件设计师教程&#xff08;三&#xff09;计算机系统知识-计算机体系结构 软件设计师教程&#xff08;…

HTTP概念协议报文结构请求响应数据报分析

文章目录前言一、HTTP的概念、特点、工作过程、应用场景二、HTTP协议报文格式查看方式三、HTTP协议数据报格式解读http请求数据报Part1:首行关于URL关于http方法Get请求Post方法【经典面试题】GET和POST区别其他方法关于HTTP协议版本号Part2:请求头&#xff08;header&#xff…

【数据库】MySQL表的增删改查(基础命令详解)

写在前面 : 语法中大写字母是关键字&#xff0c;用[]括这的是可以省略的内容。文中截图是相对应命令执行完得到的结果截图。1.CRUD 注释&#xff1a;在SQL中可以使用“--空格描述”来表示注释说明.CRUD:即增加(Create)、查询(Retrieve)、更新(Update)、删除(Delete)四个单词的首…

MOS FET继电器(无机械触点继电器)设计输入侧电源时的电流值概念

设计输入侧电源时的问题 机械式继电器、MOS FET继电器分别具有不同的特长。基于对MOS FET继电器所具小型及长寿命、静音动作等优势的需求&#xff0c;目前已经出现了所用机械式继电器向MOS FET继电器转化的趋势。 但是&#xff0c;由于机械式继电器与MOS FET继电器在产品结构…

CHAPTER 3 磁盘管理

磁盘管理1 磁盘管理1.1 块设备信息(lsblk)1.2 挂载硬盘1.2.1 挂载单个硬盘(mkfs、mount)1.2.2 磁盘分区工具(fdisk)1.2.3 创建分区1.2.4 相关命令1. df2. partprobe3. mkfs1.3 逻辑卷管理器(LVM)1. 涉及概念2. 使用LVM流程1.4 磁盘检测及修复&#xff08;fsck&#xff09;1 磁盘…

Vue 计算属性基础知识 监听属性watch

计算属性的概念 在{{}}模板中放入太多的逻辑会让模板内容过重且难以维护。例如以下代码&#xff1a; <div id"app">{{msg.split().reverse().join()}}</div><script>const vm new Vue({el: "#app",data: {msg:我想把vue学的细一点}})&…

SAP ABAP 采购订单屏幕增强

为采购订单增加一个页标签&#xff0c;在其中放入客户自定义字段&#xff0c; 1. CMOD 增强接口&#xff1a; MM06E005 EXIT_SAPMM06E_006 为子屏幕参数传入出口&#xff08;抬头&#xff09; EXIT_SAPMM06E_008 为子屏幕参数传出出口&#xff08;抬头&#xff09; EXIT_SA…

Vue基础19之插槽

Vue基础19插槽不使用插槽App.vueCategory.vue默认插槽&#xff1a;slotApp.vueCategory.vue具名插槽App.vueCategory.vue作用域插槽App.vueCategory.vue总结插槽 不使用插槽 App.vue <template><div class"bg"><Category :listData"food"…

vue-element-admin:基于element-ui 的一套后台管理系统集成方案

文章目录一、vue-element-admin1、vue-element-admin1.1简介1.2安装2、vue-admin-template2.1简介2.2安装一、vue-element-admin 1、vue-element-admin 1.1简介 vue-element-admin是基于element-ui 的一套后台管理系统集成方案。 GitHub地址&#xff1a;https://github.com…

redis集群模式登陆

总结redis单机模式时&#xff0c;登陆redis的命令格式&#xff1a; ./redis-cli -h 地址 -p 端口redis集群模式时&#xff0c;登陆redis的命令格式&#xff1a; ./redis-cli -h 地址 -p 端口 -c举例1&#xff1a;redis单机模式下登陆rootubuntu:/usr/local/redis/redis-7.0.0/b…

使用IPEmotion进行声学采集与分析

一 IPEmotion简介 IPEmotion作为IPETRONIK的软件产品&#xff0c;主要应用于车辆测试以及配合不同的车载和实验室测试系统&#xff0c;并满足其测量需求。通过专业化的数据采集软件IPEmotion&#xff0c;我们可以完成数据采集过程&#xff0c;包括&#xff1a;配置数据源/仪器…

信创系统借力小程序应用生态的可能性

随着国内市场需求的不断增长&#xff0c;国产操作系统的应用也开始逐步发展壮大。国产操作系统在与其他操作系统的竞争中&#xff0c;越来越受到用户的青睐。国产操作系统作为一个全新的市场&#xff0c;给应用开发带来了新的机遇和挑战。本文将从国产操作系统应用的现状分析、…

【LeetCode】1. 两数之和

题目链接&#xff1a;https://leetcode.cn/problems/two-sum/ &#x1f4d5;题目要求&#xff1a; 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入…

[Java·算法·困难]LeetCode32. 最长有效括号

每天一题&#xff0c;防止痴呆题目示例分析思路1题解1分析思路2题解2分析思路3题解3&#x1f449;️ 力扣原文 题目 给你一个只包含 ( 和 ) 的字符串&#xff0c;找出最长有效&#xff08;格式正确且连续&#xff09;括号子串的长度。 示例 输入&#xff1a;s "(()&q…