如何使用c语言实现循环队列

这篇文章主要介绍如何使用c语言实现循环队列,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

吉木萨尔ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:028-86922220(备注:SSL证书合作)期待与您的合作!

    队列是一种先入先出的结构,数据从队列头出,队尾进。在linux内核中进程调度,打印缓冲区都有用到队列。

    队列有多种实现方式,可以用链表,也可以用数组。这里用数组来实现一个简单的循环队列。首先创建一个大小为8的队列如下,队列头尾指针指向同一块内存,

    

如何使用c语言实现循环队列

    当从队列尾部插入一个数据后变成下面的情形,为了便于处理,这里始终会浪费一个空间

如何使用c语言实现循环队列

    继续插入数据,直到出现以下情形,表示队列满了,

如何使用c语言实现循环队列

    接下来看一下出队的情形,从队列头出队3个元素,

如何使用c语言实现循环队列

    再添加三个元素后队列又变成满的了,

如何使用c语言实现循环队列

    在上面这种情况下面,如果再添加元素就会把队列头的元素覆盖掉,如下:

如何使用c语言实现循环队列

循环队列实现代码:

#include 
#include 

/* 循环队列大小*/
#define MAX 8     

typedef struct queue {
	int *que_array;
	int front;		//指向队首
	int rear;		//指向队尾
	int valid_cnt;	//队列中有效的数据个数
    int total;      //队列总大小
} queue_t;

typedef enum {
    E_NONE     = 0,
    E_NOMEMORY = 1,
    E_FAIL     = 2,
} error_t;

void init_queue(queue_t *que)
{
	que->que_array = (int *)malloc(sizeof(int) * MAX);
	if (que->que_array == NULL) {
		printf("no mem\n");
		exit(-E_NOMEMORY);
	}
	que->front     = 0;
    que->rear      = 0;
	que->valid_cnt = 0;
    que->total     = MAX;
}

/* 判断队列是否已满 */
int is_full(queue_t *que)
{
	return (((que->rear + 1) % que->total) == (que->front));
}

/* 判断队列是否为空 */
int is_empty(queue_t *que)
{
	return (que->front == que->rear);
}

/* 元素入队 */
void entry_queue(queue_t *que, int data)
{
	if (is_full(que)) {
		printf("队列已满,添加后有可能会覆盖掉前面的元素 \n");
		que->front = ((que->front+1) % que->total);
	}
	que->que_array[que->rear % que->total] = data;
	que->rear = (que->rear+1) % que->total;
	que->valid_cnt++;
}

/* 元素出队 */
int del_queue(queue_t *que)
{
    int tmp;
    
    if (is_empty(que)) {
        printf("队列为空 \n");
        return -E_FAIL;
    }
    
    tmp = que->que_array[que->front % que->total];
	que->front = ((que->front+1) % que->total);
	que->valid_cnt--;
    
    return tmp;
}

int main(int argc, char *argv[])
{
    int tem_data,i;
	queue_t que;
    
	init_queue(&que);

#if 0
	for (i = 0; i < 7; i++) {
		entry_queue(&que, i + 1);
	}

    printf("出队队列中的所有元素 \n");
	while (!is_empty(&que)) {
		printf("%d,", del_queue(&que));
	}
#endif
	
    /*接下来,添加十个元素试试*/
    for (i = 0; i < 10; i++) {
		entry_queue(&que, i + 1);
	}

    printf("出队队列中的所有元素 \n");
	while (!is_empty(&que)) {
		printf("%d,", del_queue(&que));
	}
    
	return 0;
}

以上是“如何使用c语言实现循环队列”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注创新互联行业资讯频道!


本文标题:如何使用c语言实现循环队列
URL链接:http://myzitong.com/article/ijiege.html