版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaomifanhxx/article/details/83904202
1 队列的定义
队列(Queue)是一种先进先出的线性表,它只允许从表的一端进行插入,在另外一端进行删除结果,即跟我们排队一样排在前面的优先买票,最早买票的先离开,在队列中,允许中插入的一端叫做rear,删除的一端为front,效果图如下所示:
2 队列的分类
队列的分类主要为两类:
1)链式队列:链式队列即用链表实现的队列;
2)顺序队列:顺序队列即用数组实现的队列,通常顺序队列为循环队列;
如果用户的应用程序中设有循环队列,则必须为它设定一个最大队列长度,若用户无法预估所用队列的最大长度,则宜采用链式队列
队列的基本方法:队列的进出,清空,下面主要介绍链式队列的方法,下篇文章主要是顺序队列的方法;
3 链式队列
3.1链式队列的初始化
//链式队列
struct LinkList
{
int val;
LinkList *next;
};
struct LinkQueue
{
LinkList *front, *rear;
};
LinkQueue* create_LinkQueue()
{
LinkQueue *q = (LinkQueue*)malloc(sizeof(LinkQueue));
q->front = q->rear = (LinkList*)malloc(sizeof(LinkList));
if (q->front == NULL) return NULL;
q->front->val = NULL;
q->front->next = NULL;
return q;
}
3.2 进队列
int in_LinkQueue(LinkQueue *q,int x)
{
if (q->rear->val == NULL){ q->rear->val = x; return 1; }
LinkList *Node = (LinkList*)malloc(sizeof(LinkList));
Node->next = NULL;
Node->val = x;
q->rear->next = Node;
q->rear = Node;
return 1;
}
3.3 出队列
int out_LinkQueue(LinkQueue*q)
{
LinkList *Node = q->front;;
//Node = q->front;
q->front =q->front->next;
int ret = Node->val;
free(Node);
Node= NULL;
return ret;
}
3.4 清空队列
void clear_LinkQueue(LinkQueue*s)
{
if (is_Empty) printf("此队列为空");
else
{
while (!is_Empty)
{
out_LinkQueue(s);
}
printf("此队列为空");
}
}
3.5 遍历队列
void traverse(LinkQueue*s)
{
if (is_Empty(s)) printf("此队列为空");
else
{
LinkList *Node = s->front;
int ret;
while (Node!=NULL)
{
ret=Node->val;
printf("输出为%d", ret);
Node = Node->next;
}
}
}
3.6 判空队列
bool is_Empty(LinkQueue *s)
{
if (s->front == s->rear) return true;
else
{
return false;
}
}
4 主程序
int main()
{
LinkQueue *s = create_LinkQueue();
//进队列
in_LinkQueue(s, 11);
in_LinkQueue(s, 12);
in_LinkQueue(s, 13);
traverse(s);
//出队列
out_LinkQueue(s);
traverse(s);
//clear_LinkQueue(s);
//traverse(s);
system("pause");
}
参考博客: