数据结构(循环队列)

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

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

}

相关推荐
用户938515635073 小时前
从 O(n²) 到 O(nlogn):一文读懂快速排序的“快”与“妙”
javascript·算法
To_OC4 小时前
手写快排次次翻车?别死背快排模板了,这才是面试官想听的底层逻辑
javascript·算法·排序算法
饼干哥哥5 小时前
Reddit VOC调研太慢?搭一个AI专家团队半小时洞察任何品类|以猫用饮水机为例
人工智能·算法·ai编程
地平线开发者6 小时前
Transformer模型部署之性能优化指南
算法
地平线开发者7 小时前
人在途中:从“编译失败”到“模型可落地”——CUDA 自定义算子
算法·自动驾驶
半个落月10 小时前
从递归到快速排序:用 JavaScript 把分治思想讲明白
javascript·算法·面试
小月土星11 小时前
JavaScript 快速排序:从 pivot、双指针到分治思想
javascript·算法·面试
小月土星11 小时前
JavaScript 递归入门:从 1 到 n 求和,再到数组扁平化
javascript·算法·面试
To_OC1 天前
LC 1 两数之和:面试第一道必考题,暴力解法直接被面试官 pass
javascript·算法·leetcode