数据结构(循环队列)

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

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

}

相关推荐
Ada's3 小时前
【计算机基础系列】003:Python数据结构
开发语言·数据结构·python
Nil2084 小时前
leetcode 118杨辉三角
算法·leetcode·职场和发展
wanderist.7 小时前
线性筛法详解:从筛质数到欧拉函数、Möbius 函数与约数函数
java·数据结构·算法
All for pursuit.7 小时前
【设计-1】208.实现Trie (前缀树)
数据结构·c++·算法·leetcode
weixin_307779137 小时前
C++代码实现MATLAB中的crossval函数功能
开发语言·c++·算法·matlab
青少儿编程课堂7 小时前
背包问题(0/1 背包与完全背包)解题精讲——动态规划入门
c++·python·算法·bfs·信息学竞赛
光影少年8 小时前
为什么 JavaScript 中 0.1 + 0.2 !== 0.3,如何让其相等?
前端·javascript·算法
HEJOO98 小时前
Linux 设备驱动系列——使用全局工作队列
java·linux·算法
Code_Solitude8 小时前
c语言:递归
java·c语言·算法
程序员清风8 小时前
哈希表:从键值映射到高效查找
数据结构·哈希算法·散列表