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

顺序表设计循环队列

使用顺序表来设计队列的最大优势是顺序表有可以定位元素的下标。

并且可以以Mod来使数组下标循环

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
typedef int CQDataType;

typedef struct {
    int* array;
    int front;
    int tail;
    int cap;
} MyCircularQueue;

//创建队列
MyCircularQueue* myCircularQueueCreate(int k) {
    MyCircularQueue* obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
    obj->front = obj->tail = 0;
    obj->cap = k;
    CQDataType* tmp = (CQDataType*)malloc(sizeof(CQDataType) * (obj->cap + 1));
    obj->array = tmp;
    return obj;
}

//isEmpty() : 检查循环队列是否为空。

 

//isEmpty() : 检查循环队列是否为空。
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
    assert(obj);
    if (obj->front == obj->tail)
        return true;
    else
        return false;
}

//isFull() : 检查循环队列是否已满

//isFull() : 检查循环队列是否已满
bool myCircularQueueIsFull(MyCircularQueue* obj) {
    assert(obj);
    if ((obj->tail+1) % (obj->cap + 1) == obj->front ))
        return true;
    else
        return false;
}

//向循环队列插入一个元素。如果成功插入则返回真
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
    assert(obj);
    if (myCircularQueueIsFull(obj))
    {
        return false;
    }
    obj->array[obj->tail++] = value;
    obj->tail %= (obj->cap + 1);
    return true;
}

//从循环队列中删除一个元素。如果成功删除则返回真。
bool myCircularQueueDeQueue(MyCircularQueue* obj) 
{
    assert(obj);
    if (myCircularQueueIsEmpty(obj))
    {
        return false;
    }
    else
    {
        if (obj->front == obj->cap)
            obj->front = 0;
        else
            obj->front++;
    }
    return true;
}

//Front: 从队首获取元素。如果队列为空,返回 -1 
int myCircularQueueFront(MyCircularQueue* obj) {

    assert(obj);
    if (myCircularQueueIsEmpty(obj))
        return -1;
    else
        return obj->array[obj->front];
}

//获取队尾元素。如果队列为空,返回 -1 。
int myCircularQueueRear(MyCircularQueue* obj) {
    assert(obj);
    if (obj->front == obj->tail)
    {
        return -1;
    }
    else
    {
        if (obj->tail == 0)
        {
            return obj->array[obj->cap];
        }
        else
        {
            return obj->array[obj->tail - 1];
        }
    }
}

//内存释放
void myCircularQueueFree(MyCircularQueue* obj) {
    free(obj->array);
    obj->front = NULL;
    obj->tail = NULL;
    obj->cap = 0;
}

http://www.lryc.cn/news/45176.html

相关文章:

  • UEFI 基础教程 (十四) - 设置默认启动项为UEFI Shell
  • python编程:判断一个数是否是超级素数
  • 雷迪RD8200管线探测仪参数/管线仪使用方法/管线仪说明书
  • 会话共享保存到redis
  • python 曲线平滑处理——方法总结(Savitzky-Golay 滤波器、make_interp_spline插值法和convolve滑动平均滤波)
  • 小驰私房菜_10_camx Otp Dump
  • priority_queue(堆)干货归纳+用法示例
  • miniprogram-to-uniapp使用指南(各种小程序项目转换为uni-app项目)
  • BZOJ2720: [Violet 5]列队春游 【概率与期望】
  • 脉诊之脉象——平脉,常见病脉,七绝脉
  • 第05章_存储引擎
  • 【新2023Q2押题JAVA】华为OD机试 - 挑选字符串
  • 职场「OKR」,魔幻又内卷
  • mysql8计算商家距离,按照由近及远排序
  • c语言函数使用记录
  • VBA智慧办公4——符号运算及语法结构
  • ChatGPT角色扮演提示语
  • 【Java面试题】设计模式之七种结构性模式——代理模式、适配器模式、桥接模式、装饰模式、外观模式、享元模式、组合模式
  • 【从零开始学习 UVM】6.3、UVM 激励产生 —— start() 方法执行sequence详解
  • 「Python 机器学习」Matplotlib 数据探索
  • 3.24-3.26学习总结
  • OpenAI Translator 基于 ChatGPT API 的划词翻译工具
  • git常用指令---复习向
  • 安卓开发学习记录(持续学习)
  • 【redis】AOF日志:宕机了,Redis如何避免数据丢失
  • 第三章Vue中的Ajax
  • 在 Python3 中使用 JSON
  • 图神经网络GNN介绍
  • 【面试】TCP、UDP、Socket、HTTP网络编程面试题
  • Python语言的文件读写