数据结构(循环队列)

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

//因为顺序栈\链式栈 这俩插入和删除的时间复杂度都是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->base[pcq->rear]=val;

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

return true;

//assert(pcq != NULL);

//if (Full(pcq))

// return false;

//CircleQuene* p = pcq;

//pcq->base[pcq->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->base[i]);

}

printf("\n");

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

//{

// printf("%d ", pcq->base[i]);

//}

//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;*/

}

相关推荐
平行侠1 小时前
30MacLaren-Marsaglia算法故事文件
数据结构·算法
灵动小溪1 小时前
claude code工具PC安装部署
人工智能·算法
Asa121382 小时前
Nature Microbiology|跨微生物界菌株水平传播推断的新算法TRACS
算法
叼烟扛炮2 小时前
C++ 知识点22 函数模板
开发语言·c++·算法·函数模版
Tisfy2 小时前
LeetCode 2553.分割数组中数字的数位:模拟(maybe+翻转)——java也O(1)
java·数学·算法·leetcode·题解·模拟·取模
平行侠2 小时前
33水库抽样 - 从未知大小的流中等概率采样
数据结构·算法
吴声子夜歌2 小时前
Java——Integer与二进制算法
java·算法
Controller-Inversion2 小时前
42. 接雨水
数据结构·算法·leetcode
Controller-Inversion2 小时前
33. 搜索旋转排序数组
数据结构·算法·leetcode