顺序队列
顺序队列是受到限制的顺序表,是顺序表的一种,符合队列先进先出逻辑。
队列构造
使用结构体构造一个顺序队列,其中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;
}