队列(Queue) ----数据结构

队列               

  1. 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 FIFO(First In First Out) 的性质
  2. 入队列:进行插入操作的一端称为队尾 (Tail / Rear)
  3. 出队列:进行删除操作的一端称为队头 (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);
}

要是看到这里的,就给大家推荐一首歌的,今天在听的是   一个人想着一个(说唱版)---利比 唱的

posted @ 2025-05-18 11:12  记得要好好吃饭  阅读(30)  评论(0)    收藏  举报