1、队列数据类型的特点是先进先出。
可以用顺序结构通过数组来实现,也可以用链表来实现。今天就拿链表来举例。
首先是需要明确的一些必备操作。
1、队列的初始化
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>
//表示链表节点的类型
struct node
{
int data;
struct node *next;
};
//表示队列的基本信息
struct queue
{
struct node *first; //第一个节点的地址
struct node *tail ; //最后一个节点的地址
int len; // 队列的长度
int count; //队列的实际长度
};
/队列的初始化
void queue_init(struct queue *pq, int n)
{
pq->first = NULL;
pq->tail = NULL;
pq->len = n;
pq->count = 0;
}
先定义一个结构体用来保存数据,为了方便链表操作在定义一个结构体来表示这个队列第一个节点和最后一个节点。
队列的初始化。
如何判断队列为空呢?
//判断队列是否为空
bool is_empty(struct queue q1)
{
if(q1.first == NULL)
{
return true;
}
else
{
return false;
}
}
判断队列是否已满
//判断队列是否已满
bool is_full(struct queue q1)
{
if(q1.len == q1.count)
{
return true;
}
else
{
return false;
}
}
入队(尾部追加)
bool queue_push(struct queue *pq, int data)
{
//判断队列是否已满
if(is_full(*pq))
{
printf("入队失败,队列已满!\n");
return false;
}
//正确入队操作
struct node *pnew = NULL;
pnew = (struct node*)malloc(sizeof(struct node));
assert(pnew!=NULL);
pnew->data = data;
pnew->next = NULL;
if(pq->first == NULL) //pnew 是队列的第一个节点
{
pq->first = pnew;
pq->tail = pnew;
}
else //队列是一个非空的队列
{
pq->tail->next = pnew;
pq->tail = pnew;
}
pq->count ++;
return true;
}
//出队(头部删除)
bool queue_pop(struct queue *pq, int *pdata)
{
//判断队列是否为空
if(is_empty(*pq))
{
printf("出队失败,队列为空!\n");
return false;
}
//正常出队操作
struct node *pdel = NULL;
pdel = pq->first;
if(pdata != NULL) //返回出队的数据
{
*pdata = pdel->data;
}
if(pq->first->next == NULL) //队列只有一个节点
{
pq->first = NULL;
pq->tail = NULL;
free(pdel);
}
else //多个节点
{
pq->first = pdel->next;
free(pdel);
}
pq->count --;
return true;
}
int main()
{
struct queue q1;
queue_init(&q1, 5);
queue_push(&q1, 2);
queue_push(&q1, 4);
queue_push(&q1, 6);
queue_push(&q1, 8);
int data;
queue_pop(&q1, &data);
printf("Data: %d\n", data);
queue_pop(&q1, &data);
printf("Data: %d\n", data);
queue_pop(&q1, &data);
printf("Data: %d\n", data);
queue_pop(&q1, &data);
printf("Data: %d\n", data);
queue_pop(&q1, &data);
return 0;
}