队列
- 队列是只允许在一端删除,在另一端插入的顺序表
- 允许删除的一端叫队头(front),允许插入的一端叫队尾(rear)
- 先进先出(FIFO)
定义队列结构
//定义链式结点
typedef struct _node
{
Data data;
struct _node *next;
}Node;
typedef struct _queue
{
Node *front; //队头指针
Node *rear; //队尾指针
}Queue;
队列的初始化
void Init(Queue *q)
{
if (NULL == q)
return;
//队头指针和队尾指针置空
q->front = NULL;
q->rear = NULL;
}
队列的进队
注意:需要考虑空队列的情况,涉及到front->next,front初始化为NULL,段错误
/队列从队尾插入
void Push(Queue *q, Data data)
{
if (NULL == q)
return;
Node *node = (Node *)malloc(sizeof(Node)/sizeof(char));
if (NULL == node)
return;
node->data = data;
node->next = NULL;
//需要考虑空队列的情况,涉及到front->next,front初始化为NULL,段错误
if (q->front != NULL)
{
q->rear->next = node;
q->rear = node;
}
//空队列的情况
else
{
q->rear = node;
q->front = node;
}
}
判断队列是否为空
//判断队头指向是否为空
BOOL Empty(Queue *q)
{
if (NULL == q)
return;
if (q->front != NULL)
return FALSE;
return TRUE;
}
队列的出队
注意:需要考虑出队后为空队列的情况,涉及到front->next,front初始化为NULL,段错误
//从队头出队列
void Pop(Queue *q)
{
if (NULL == q)
return;
//避免空队列出
if (TRUE == Empty(q))
return;
//队头出列
Node *tmp = q->front;
q->front = tmp->next;
free(tmp);
//若出栈后为空队列
if (q->front == NULL)
{
q->rear = NULL;
}
}
队头获取数据
Data GetTop(Queue *q)
{
if (NULL == q)
return;
return q->front->data;
}