顺序队列

顺序队列

 顺序队列是受到限制的顺序表,是顺序表的一种,符合队列先进先出逻辑。

队列构造

 使用结构体构造一个顺序队列,其中ent用来指向一个连续内存,size用来指定内存的大小,r_pos和w_pos用来读取和写数据时作为ent的下标。

typedef struct queue
{
    int *ent;    //队列入口地址
    int size;
    int r_pos;   //读位置
    int w_pos;   //写位置
}my_queue, *p_my_queue;

队列初始化

 初始化队列。分配堆内存,设置顺序表大小,r_pos和w_pos应该为0。

p_my_queue init_queue(int size)
{
    p_my_queue new_queue =  calloc(1, sizeof(my_queue));
    new_queue->ent = calloc(size, sizeof(int));

    if (NULL == new_queue)
        return NULL;

    new_queue->r_pos = 0;
    new_queue->w_pos = 0;
    new_queue->size  = size;

    return new_queue;
}

写数据

 写数据,每写一次数据w_pos加1,注意当w_pos+1等于r_pos时,表示队列已满,无法再添加数据了,将会返回退出。

p_my_queue write_queue(p_my_queue queue_list)
{
    if (NULL==queue_list)
        return false;

    if( (queue_list->w_pos+1)%queue_list->size == queue_list->r_pos)
    {
        printf("Failed to join the queue. The queue is full
");
        return queue_list;
    }
    
    queue_list->ent[queue_list->w_pos] = input_msg("Please enter data to join the queue");
    queue_list->w_pos = (queue_list->w_pos+1)%queue_list->size;
    return queue_list;
}

读数据

 读数据,每读一次r_pos加1,注意当r_pos与w_pos相等时,表示队中没有数据了,将会返回退出。

int read_queue(p_my_queue queue_list)
{
    if (NULL==queue_list)
         return false;
    
    if(queue_list->r_pos == queue_list->w_pos)
    {
        printf("There are no data to read
");
        return -1;
   }

    int data = queue_list->ent[queue_list->r_pos];
    queue_list->r_pos = (queue_list->r_pos+1)%queue_list->size;

    return data;
}

测试程序

int test()
{
    p_my_queue queue_list = NULL;
    int size = 8;

    queue_list = init_queue(size);

    queue_list = write_queue(queue_list);
    queue_list = write_queue(queue_list);
    queue_list = write_queue(queue_list);
    queue_list = write_queue(queue_list);
    queue_list = write_queue(queue_list);
    queue_list = write_queue(queue_list);
    queue_list =  write_queue(queue_list);
    queue_list =  write_queue(queue_list);

    for (int i = 0; i < 8; i++)
    {

        int data = read_queue(queue_list);
        printf("data:%d
", data);
    }

    return 0;
}
原文地址:https://www.cnblogs.com/ding-ding-light/p/14123430.html