首页 > 其他分享 >【C 数据结构】循环队列

【C 数据结构】循环队列

时间:2023-03-20 10:01:09浏览次数:41  
标签:myQueue return 队列 back int 循环 que front 数据结构

循环队列

  • 预先分配好数组空间
#define BUFFER_SIZE 1024
// 在栈区分配空间
int buf[N];

// 在堆区分配空间
int* buf;
buf = (int*)malloc(BUFFER_SIZE * sizeof(int));
  • 定义队头指针和队尾指针
int front, back;

循环队列

思路:front 始终指向队头元素位置的前一个位置,back 始终指向队尾元素位置。

  • 出队操作就是先将 front 后移 front = (front + 1) % BUFFER_SIZE 然后将队头buf[front]出队。
  • 入队操作就是先将 back 后移 back = (back + 1) % BUFFER_SIZE 然后入队 buf[back]=x

1 初始化

  • 开始,队中没有元素。front = back = 0
void init(){
    front = back = 0;
}

2 队空和队满判断

队空条件和队满条件相同,都是 front == back

  • 解决方法:
    • 方法一:附设一个存储队中元素个数的变量 size
    • 方法二:少用一个元素空间,使 (back + 1) % BUFFER_SIZE == front 为队满条件
  • 方法一:
int isEmpty(){
    return front == back;// 或 size == 0
}

int isFull(){
    return size == BUFFER_SIZE;
}
  • 方法二:
int isEmpty(){
    return front == back;
}

int isFull(){
    return (back + 1) % BUFFER_SIZE == front;
}

3 入队操作和出队操作

  • 方法一:
#define inf 0x3f3f3f3f

int pop_front(){
    if(front == back) return inf;
    
    front = (front + 1) % BUFFER_SIZE;
    return buf[front];
}

int push_back(int x){
    if(size == BUFFER_SIZE) return 0;
    
    back = (back + 1) % BUFFER_SIZE;
    buf[back] = x;
    
    return 1;
}
  • 方法二:
#define inf 0x3f3f3f3f

int pop_front(){
    if(front == back) return inf;
    
    front = (front + 1) % BUFFER_SIZE;
    return buf[front];
}

int push_back(int x){
    if((back + 1) % BUFFER_SIZE == front) return 0;
    
    back = (back + 1) % BUFFER_SIZE;
    buf[back] = x;
    
    return 1;
}

完整实现代码

myQueue.h

#define N 50
#define INF 0x3f3f3f3f

typedef struct 
{
    int* buf;
    int front;	///< 队头指针
    int back;	///< 队尾指针
    int size;	///< 队列实际尺寸
}myQueue;

extern void initQueue(myQueue*);

extern int isEmpty(const myQueue*);

extern int isFull(const myQueue*);

extern int queueSize(const myQueue*);

extern int pop_front(myQueue*); 

extern int push_back(myQueue*, int);

myQueue.c

#include "../include/myQueue.h"
#include <stdlib.h>

/// @brief 初始化循环队列
/// @param que 要初始化的队列对象的指针
void initQueue(myQueue* que)
{
    que->buf = (int*)malloc(N * sizeof(int));
    que->front = 0;
    que->back = 0;
    que->size = 0;
}

/// @brief 判断队列是否为空
int isEmpty(const myQueue* que)
{
    return que->front == que->back;
}

/// @brief 判断队列是否满了
int isFull(const myQueue* que)
{
    return que->size == N;
}

/// @brief 得到队列的长度
int queueSize(const myQueue* que)
{
    return que->size;    
}

/// @brief 出队
int pop_front(myQueue* que)
{
    if(!que->size) return INF;

    que->front = (que->front + 1) % N;
    que->size --;
    return que->buf[que->front];
}

/// @brief 入队
int push_back(myQueue* que, int x)
{
    if(que->size == N) return 0;

    que->back = (que->back + 1) % N;
    que->buf[que->back] = x;
    que->size ++;
    return 1;
}

标签:myQueue,return,队列,back,int,循环,que,front,数据结构
From: https://www.cnblogs.com/Critical-Thinking/p/17235308.html

相关文章

  • 【VTK学习笔记】VTK基本数据结构_3.2数据对象和数据集
    任务:把几何结构和拓扑结构加入到数据集中1.无拓扑结构1#include<vtkSmartPointer.h>2#include<vtkPoints.h>//几何结构3#include<vtkPolyData.h>//数据集......
  • 数据结构-图
    1.图的概念基础概念顶点集合(vex-set):如上图S(vex)=边集合(arc-set):如上图S(arc)=度(degree):⽆向图中从⼀个点延伸出去的边数就是该点的度;有向图中包含出度和⼊......
  • [LeetCode] 数据结构入门
    数据结构入门217存在重复元素给你一个整数数组nums。如果任一值在数组中出现至少两次,返回true;如果数组中每个元素互不相同,返回false。解法1:两层循环第一层循......
  • 外界参数控制多线程队列进行与否
    业务场景,最近遇到个需求,就是通过点击开始/继续要控制任务进度,刚开始想到了线程wait,notify本人是个比较懒得人,一想到要写那么多代码空值,要等待,唤醒,睡眠啥的就觉得麻烦,出......
  • Html jquery AJAX 循环 延时 刷新
    JSON(PHP)<?php@header("content-type:application/json;charset=UTF-8");echo'{"status":200,"data":{"name":"55","student":[{"id":10001,"name":"张三"},{......
  • Spring三级缓存与解决循环依赖
    一、什么是循环依赖、一级缓存A、B两个Service相互依赖,类似于死锁,我们来看AServiceBean的生命周期  我们要填充bService时,在单例池找不到B,就会先去创建B。但是创建B......
  • JUC提供了哪些阻塞队列
    阻塞队列的处理方法阻塞队列实现了BlockingQueue接口,并且有多组处理方法。抛出异常add方式是往队列里面添加元素,如果队里队列满了,会抛出异常remove方法是删除元素,如......
  • 说说对AQS(AbstractQueuedSynchronizer)队列同步器的理解
    AQS是构建锁或者其他同步组件的基础框架(如ReentrantLock、ReentrantReadWriteLock、Semaphore等),包含了实现同步器的细节(获取同步状态、FIFO同步队列)。AQS的主要使用......
  • Django笔记二之连接数据库、执行migrate数据结构更改操作
    本篇笔记目录索引如下:Django连接mysql,执行数据库表结构迁移步骤介绍操作数据库,对数据进行简单操作接下来几篇笔记都会介绍和数据库相关,包括数据库的连接、操作(包括增......
  • 优先队列(PriorityQueue)常用方法及简单案例
    1前言PriorityQueue是一种特殊的队列,满足队列的“队尾进、队头出”条件,但是每次插入或删除元素后,都对队列进行调整,使得队列始终构成最小堆(或最大堆)。具体调整如下:插入......