数据结构(循环队列)

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

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

}

相关推荐
散峰而望19 分钟前
【算法练习】算法练习精选:陶陶摘苹果(基础+升级)、Music Notes、字串变换,你能AC几道?
数据结构·c++·算法·leetcode·贪心算法·github·动态规划
暗夜猎手-大魔王25 分钟前
转载--Hermes Agent 04 | Agent 主循环:一次对话背后发生了什么
人工智能·python·算法
手写码匠1 小时前
华为云Flexus+DeepSeek征文|基于华为云Flexus X实例 + Dify + DeepSeek 构建企业级智能知识库问答系统实战
人工智能·深度学习·算法·aigc
凤凰院凶涛QAQ1 小时前
《Java版数据结构 & 集合类剖析》集合框架的封装设计与顺序表:“从 Iterable 到 ArrayList:集合框架的‘职业树“
java·开发语言·数据结构
吴可可1231 小时前
Win7上开发CAD2004自定义实体全解析
c++·算法
YXXY3131 小时前
二叉树中的深搜算法介绍
算法
zz34572981131 小时前
C语言中字符串常量存储位置
c语言·开发语言·算法·青少年编程
noipp1 小时前
推荐题目:洛谷 P16510 [GKS 2015 #C] gRanks
java·c语言·开发语言·c++·python·算法
菜菜的顾清寒1 小时前
力扣HOT100(50)动态规划-零钱兑换
算法·leetcode·动态规划
周末也要写八哥1 小时前
三分钟读懂:如何解决做题数量不足的问题?
算法