队列 先进先出 FIFO
queue.h
//queue.h 队列头文件
#ifndef __QUEUE_H_
#define __QUEUE_H_
#include<stdio.h>
#include<stdlib.h>// malloc()
//定义队列
typedef struct queue{
int* arr;//存储区的首地址
int cap;//队列的容量,能装多少
int size;//有效元素的个数,已经装了多少
int front;//要出队的元素的下标
int rear;//要入队的元素的下标
}queue_t;
//队列的操作
//队列的初始化 queue_t queue;
void queue_init(queue_t* q,int cap);
//队列的终结化
void queue_deinit(queue_t* q);
//队列判满 返回1 返回0
int queue_full(queue_t* q);
//队列判空 返回1 返回0
int queue_empty(queue_t* q);
//入队
void queue_push(queue_t* q,int data);
//出队
int queue_pop(queue_t* q);
#endif //__QUEUE_H_
queue.c
//queue.c 队列的实现
#include"queue.h"
//队列的初始化
//queue_t queue;
//queue_init(&queue,5);
void queue_init(queue_t* q,int cap){
//分配存储区
q->arr = malloc(sizeof(int) * cap);
q->cap = cap;//容量
q->size = 0;//元素个数
q->front = 0;//取的下标
q->rear = 0;//存的下表
}
//队列的终结化
void queue_deinit(queue_t* q){
//释放存储区
free(q->arr);
q->arr = NULL;
q->cap = 0;
q->size = 0;
q->front = 0;
q->rear = 0;
}
//队列判满
int queue_full(queue_t* q){
if(q->cap == q->size){
return 1;
}else{
return 0;
}
}
//队列判空
int queue_empty(queue_t* q){
if(q->size == 0){
return 1;
}else{
return 0;
}
}
//入队
void queue_push(queue_t* q,int data){
//如果rear已经超过了最后的存储位置,应该归0,从头开始
if(q->rear == q->cap){
q->rear = 0;
}
//存入数据
q->arr[q->rear] = data;
//rear后移,记录下一个位置
q->rear++;
//计数加一
q->size++;
}
//出队
int queue_pop(queue_t* q){
//如果front已经超过了最后的位置,则归0
if(q->front == q->cap){
q->front = 0;
}
//取出数据
int data = q->arr[q->front];
//front后移,记录下一个位置
q->front++;
//计数减一
q->size--;
return data;
}
mian.c
//main.c 队列的测试
#include"queue.h"
int main(void){
//定义队列
queue_t queue;
//初始化
queue_init(&queue,5);
//入队
int data = 1;
//循环,直到队列满为止
while(queue_full(&queue) != 1){
queue_push(&queue,data++);
}
//出队
while(1){
//如果队列空,则结束循环
if(queue_empty(&queue) == 1){
break;
}
printf("%d\n",queue_pop(&queue));
}
return 0;
}