数据结构(循环队列)

//循环队列 用顺序表来实现的队列

//因为顺序栈\链式栈 这俩插入和删除的时间复杂度都是O(1)

//而此时的时间复杂度不是O(1)

//4个难点

//1 如何对顺序表进行改造 让其的时间复杂度变为1

// 只需要再插入和删除的时候 让其队头和队尾指针移动 让其数据本身不移动

//2 怎么将出队时的空闲格子再次利用

// 让其首尾相连

//3 如果头尾相连 判空和判满条件冲突了 怎么解决

// 1 加一个标签 加一个成员变量 Size (保存当前元素个数) 判空 头尾相遇 && Size=0; 判满 头尾相遇 && Size!=0;

// 2 用尾巴处一个空格作为标记 此时头尾相遇 只能当作判空条件 而判满条件 队尾指针向后再走一步遇到队头

//4 怎么找到一个通用公式 用来求出当前循环队列有效元素的个数

// Size=(rear-front +MAXSIZE)%MAXSIZE

#include<stdio.h>

#include<assert.h>

#include "Seqlist.h"

#include <stdlib.h>

#include <string.h>

#include <errno.h>

#include "Circle_Quene.h"

//1初始化

void Init_CircleQuene(CircleQuene* pcq)

{

pcq->base = (ELEMTYPE*)malloc(MAXSIZE * sizeof(ELEMTYPE));

if (pcq->base == NULL)

exit(EXIT_FAILURE);

pcq->front = 0;

pcq->rear = 0;

/*pcq->base = (ELEMTYPE*)malloc(MAXSIZE * sizeof(ELEMTYPE);

if (pcq->base == NULL)

exit(EXIT_FAILURE);

pcq->front = 0;

pcq->rear = 0;*/

}

//2入队

bool Push(CircleQuene* pcq, ELEMTYPE val)

{

assert(pcq != NULL);

if (Full(pcq))

return false;

CircleQuene* p = pcq;

pcq->basepcq-\>rear=val;

pcq->rear = (pcq->rear + 1) % MAXSIZE;

return true;

//assert(pcq != NULL);

//if (Full(pcq))

// return false;

//CircleQuene* p = pcq;

//pcq->basepcq-\>rear = val;

//pcq->rear = (pcq->rear + 1) % MAXSIZE;

}

//3出队

bool Pop(CircleQuene* pcq)

{

assert(pcq != NULL);

if (Empty(pcq))

return false;

pcq->front=(pcq->front+1)%MAXSIZE;

/*assert(pcq != NULL);

if (Empty(pcq))

return false;

pcq->front = (pcq->front + 1) % MAXSIZE;*/

}

//5.判空

bool Empty(CircleQuene* pcq)

{

//assert

return pcq->front == pcq->rear;

/*return pcq->front == pcq->rear;*/

}

//5.5 判满

bool Full(CircleQuene* pcq)

{

//assert

return (pcq->rear + 1) % MAXSIZE == pcq->front;

/*return (pcq->rear + 1) % MAXSIZE == pcq->front;*/

}

//6.打印(用来测试的)

void Show(CircleQuene* pcq)

{

//assert

for (int i = pcq->front; i != pcq->rear; i = (i + 1) % MAXSIZE)

{

printf("%d ", pcq->basei);

}

printf("\n");

///*for (int i = pcq->front; i != pcq->rear; i = (i + 1) % MAXSIZE)

//{

// printf("%d ", pcq->basei);

//}

//printf("\n");*/

}

//6.5 清空

void Clear(CircleQuene* pcq)

{

//assert

pcq->front = 0;

pcq->rear = 0;

//pcq->front = pcq->rear = 0;

//pcq->front = pcq->rear;

/*pcq->front = 0;

pcq->rear = 0;*/

}

//7.销毁

void Destroy(CircleQuene* pcq)

{

//assert

free(pcq->base);

pcq->base = NULL;

pcq->front = pcq->rear = 0;

////free(pcq->base);

//pcq->base = NULL;

//pcq->front = pcq->rear = 0;

}

//8.获取队列有效元素个数

int Get_Size(CircleQuene* pcq)

{

return (pcq->rear - pcq->front + MAXSIZE) % MAXSIZE;

/*return (pcq->rear - pcq->front + MAXSIZE) % MAXSIZE;*/

}

相关推荐
小蒋学算法7 分钟前
算法-滑动窗口最大值
数据结构·算法
冷小鱼18 分钟前
AI Agent的核心算法:自主学习与反思(Self-Reflection / Critique)
人工智能·学习·算法·自主学习·self-reflection·critique·反思
youtootech9 小时前
HarmonyOS《柚兔学伴》项目实战09-待办列表 UI——List+ForEach+滑动删除
数据结构·ui·华为·list·harmonyos
:-)10 小时前
算法-归并排序
java·开发语言·数据结构·算法·排序算法
Jerry14 小时前
LeetCode 101. 对称二叉树
算法
可编程芯片开发15 小时前
基于MPPT最大功率跟踪的离网光伏发电系统Simulink建模与仿真
算法
AI科技星15 小时前
线性算子不是空间映射函数,是全域双螺旋场之间拉伸、旋转、耦合、坍缩的跨空间标准化变换载体《全域数学vs传统数学:人类文明进阶200讲》第80讲
线性代数·算法·矩阵·数据挖掘·回归·乖乖数学·全域数学
米罗篮15 小时前
矩阵快速幂 (Exponentiation By Squaring Applied To Matrices)
c++·线性代数·算法·矩阵
dream_home840715 小时前
图像算法模型NPU适配与算法服务实战指南
人工智能·python·算法·npu 图像服务
大鱼>16 小时前
多宠物家庭智能管理平台:云端架构与多设备协同实战
python·算法·iot·宠物