队列
队列
和栈一样是一种线性表变异体。现实中很多情况下都要排队,先来后到,队列就是类似这种情况的一种数据结构,数据只允许从同一端插入,删除只允许从另一端删除,插入操作叫 入队
,删除操作叫出队
;插入的一端叫队尾,删除的一端叫队头。队列可以用顺序存储
和链式存储
实现。顺序储存方式一般是用数组实现,一般的实现方式也就是所说的环形缓冲区就是顺序存储方式实现的FIFO
链式存储实现代码
- 数据结构
typedef struct _data_node
{
int data;
struct _data_node *next;
}data_node_t;
typedef struct _link_queue
{
data_node_t *front; //队头
data_node_t *rear; //队尾
int queue_size; //队列大小
int queue_count; //队列数据计数
}link_queue_t;
- 队列是否为空
static int is_queue_empty(link_queue_t *q)
{
return (q->queue_count == 0);
}
- 队列是否满
static int is_queue_full(link_queue_t *q)
{
return ( q->queue_count >= q->queue_size );
}
- 队列初始化
int link_queue_init(link_queue_t *q, int queue_size)
{
if(!q || queue_size <= 0)
return -1;
q->front = NULL;
q->rear = NULL;
q->queue_count = 0;
q->queue_size = queue_size;
}
- 队列解初始化
int link_queue_deinit(link_queue_t *q)
{
if(!q)
return -1;
if(is_queue_empty(q))
{
q->front = NULL;
q->rear = NULL;
q->queue_count = 0;
q->queue_size = 0;
}
else
{
data_node_t *node = q->front;
for(int i = 0; ( (i < q->queue_count) && !node); i++, node = node->next)
{
data_node_deinit(node);
}
}
return 0;
}
- 入队
/************************************************************************
* @brief: enter queue
* @param[in]: None
* @retval[out]: None
* @note:
* @author: guangjieMVP
**************************************************************************/
int link_queue_en(link_queue_t *q, int val)
{
if(!q)
return -1;
data_node_t *d = data_node_init(val);
if(!d)
return -1;
if(is_queue_full(q))
return -1;
if(is_queue_empty(q))
{
q->rear = d;
q->front = d;
q->queue_count++;
}
else
{
q->rear->next = d;
q->rear = d;
q->queue_count++;
}
return 0;
}
- 出队
/************************************************************************
* @brief: out queue
* @param[in]: None
* @retval[out]: None
* @note:
* @author: guangjieMVP
**************************************************************************/
int link_queue_out(link_queue_t *q, int *val)
{
data_node_t *node;
if(!q)
return -1;
if(is_queue_empty(q))
return -1;
node = q->front;
q->front = node->next;
*val = node->data;
q->queue_count--;
data_node_deinit(node);
return 0;
}