循环队列C语言实现

循环队列C语言实现

特性: 先进先出(First In First Out=FIFO),取数从队列的开头取,存储从队列尾部存。第一个元素又称首元素,最后一个元素又称尾元素。

Linux系统三大队列:
消息队列:进程间通信的一种手段。
工作队列:延后执行的一种手段。
等待队列:随时随地让进程休眠并且让进程随时随地被唤醒。

/*循环队列*/
#include 
#include 
/*声明描述队列属性的结构体*/
typedef struct queue {
    int *arr; //首地址
    int cap; //容量
    int size; //有效数据的个数
    int front; //前端(出队)
    int rear; //后端(入队)
}queue_t;
//1.定义分配内存和初始化队列函数
void queue_init(queue_t *queue, int cap)
{
    queue->arr = (int *)malloc(cap * sizeof(queue->arr[0]));//分配内存
    queue->cap = cap; //容量
    queue->size = 0; //无数据
    queue->front = 0; 
    queue->rear = 0;
}
//2.释放内存并且恢复到初始状态
void queue_deinit(queue_t *queue)
{
    free(queue->arr);
    queue->cap = 0; 
    queue->size = 0; //无数据
    queue->front = 0; 
    queue->rear = 0;

}
//3.判断是否满
int queue_full(queue_t *queue)
{
	return queue->size >= queue->cap; //满返回1,不满返回0
}
//4.判断是否空
int queue_empty(queue_t *queue)
{
	return !queue->size; //空返回1,不空返回0
}
//5.入队
void queue_push(queue_t *queue,int data)
{
	if(queue_full(queue)){
		printf("queue is full,it doesn't be pushed\n");
		return;
	}
	if(queue->rear >= queue->cap)  //队列未满,尾标大于等于容量时让尾标重新置0,成为循环队列
		queue->rear = 0;
	queue->arr[queue->rear++] = data;
	queue->size++;
}
//6.出队
int queue_pop(queue_t *queue)
{
	if(queue_empty(queue)){
		printf("queue is empty,it does't be poped\n");
		return 0;
	}
	if(queue->front >= queue->cap)
		queue->front = 0;
	queue->size--;
	return queue->arr[queue->front++];
}
//7.获取有效数据的个数
int queue_size(queue_t *queue)
{
	return queue->size;
}
//8.获取队首元素的值
int queue_first(queue_t *queue)
{
	return queue->arr[queue->front];
}
//测试主函数
int main(void)
{
    //1.定义队列
    queue_t queue;

    //2.初始化队列
    queue_init(&queue, 4);

    //3.销毁队列
    //queue_deinit(&queue);

    //4.入队:10 20 30 40
    for(int i = 10;i <= 40;i += 10){
    	queue_push(&queue,i);
    }
    

    //5.出队:10 20
    for(int i = 0;i < 2;i++){
    	printf("%d ",queue_pop(&queue));
    }
    printf("\n");

    //6.入队:50 60 30 40
    for(int i = 50;i <= 60;i += 10){
    	queue_push(&queue,i);
    }

    //7.获取队列当前的首元素值
    printf("%d\n",queue_first(&queue));//元素并没有出队
    //或
    printf("%d\n",queue_pop(&queue));//元素出队了
	
	//8.获取队列最开始的首元素位置的值
	printf("%d\n",queue.arr[0]);//元素并没有出队
	
    //9.整体出队
    while(!queue_empty(&queue)){
    	printf("%d ",queue_pop(&queue));
    }
    return 0;
}






你可能感兴趣的:(数据结构与算法,c语言,开发语言,后端)