队列(Queue) ----数据结构
队列
- 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 FIFO(First In First Out) 的性质
- 入队列:进行插入操作的一端称为队尾 (Tail / Rear)
- 出队列:进行删除操作的一端称为队头 (Head / Front)

循环队列
****************如果用普通队列,那么我们就要一直移动数据来补齐队列,给后续入队的数据腾出空间****************
为了解决传统队列的空间浪费问题,循环队列应运而生。循环队列将数组的首尾相连,形成一个环形结构。当 rear 指针到达数组末尾时,如果数组前面还有空闲空间,rear 指针会绕回到数组的起始位置,继续利用空闲空间存储数据。

重点:循环队列判断队列是否已满

循环队列整体框架已经完成、还待完善(完成度90%)
/*************************************************************************
* file name:queue
* function: 实现对队列的增删改查功能
* date: 2025.5.18
* note:none
* Copyright (c) 2024-2025 l550036303@163.com All right reserved
**************************************************************************/
#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
typedef int typedata; //数据类型
typedef struct queue{
typedata *Addr; //存储的空间
int front; //队首
int rear; //队尾
int size; //长度
}que_t;
que_t * que_t_creat(typedata size){
que_t * manager =(que_t *)calloc(1,sizeof(que_t));
if(NULL == manager){
perror("\tqueue creat fail\n");
return false;
}
manager->Addr =(typedata *)calloc(size,sizeof(typedata));
if(NULL == manager->Addr ){
perror("\tAddress of queue creat fail\n");
return false;
}
manager->size = size;
manager->front = 0;
manager->rear = 0;
return manager;
}
bool que_t_IsFull(que_t * manager){
return manager->front == (manager->rear + 1) % manager->size;
}
bool que_t_IsEmpty(que_t * manager){
if( manager->front == (manager->rear) ){
return true;
}
return false;
}
bool que_t_PUSH(que_t * manager,typedata date){
if(que_t_IsFull(manager)){
printf("\tthis queue is full\n");
return false;
}
manager->Addr[manager->rear] = date;
manager->rear = (++manager->rear)%(manager->size);
printf("\tPUSH access\n");
return true;
}
/*********************************************************************************
*
* name:que_t_POP
* fuction:实现队列的出队,并把出队的值返回
* parameter:
* @manager 要操作的队列
* retval: 返回出队数据所存储的值
* date: 2025.5.18
* version: v1.0
* note: 如果需要值,要单独接收返回值
*
******************************************************/
typedata que_t_POP(que_t * manager){
if(que_t_IsEmpty(manager)){
printf("\tthis queue is Empty\n");
return false;
}
//1、先把数据给temp
typedata temp = manager->Addr[manager->front];
//2、把该位置清零
manager->Addr[manager->front] = 0 ;
//3、让队首+1向后移动
manager->front = (++manager->front)%(manager->size);
printf("\tPOP access\n");
return temp;
}
bool que_t_printf(que_t * manager){
if(que_t_IsEmpty(manager)){
printf("\tthis queue is Empty\n");
return false;
}
// for(int i = (manager->rear - manager->front + manager->size)% manager->size ; i >= 0 ; i-- ){
// printf("%d",manager->Addr[i]);
// }
for(typedata i = manager->front ; i != manager->rear ; i = (++i) % (manager->size) ){
printf("\tdate[%d]:%d \n",i,manager->Addr[i]);
}
return true;
}
void main(){
que_t * manager=que_t_creat(10);
for(int i= 1 ;i<13 ; i++){
que_t_PUSH(manager,i);
}
// for(int i= 1 ;i<5 ;i++){
// que_t_POP(manager);
// }
// for(int i= 1 ;i<13 ; i++){
// que_t_PUSH(manager,i);
// }
que_t_POP(manager);
que_t_PUSH(manager,100);
que_t_PUSH(manager,10000);
for(int i= 1 ;i<5 ; i++){
que_t_POP(manager);
}
que_t_PUSH(manager,10000);
que_t_printf(manager);
printf("\n\tsmanager->front=%d\tmanager->rear=%d\tmanager->size=%d\n",manager->front,manager->rear,manager->size);
}
要是看到这里的,就给大家推荐一首歌的,今天在听的是 一个人想着一个(说唱版)---利比 唱的

浙公网安备 33010602011771号