概念
队列:队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
ps:可以将队列看成日常生活中排队,先排队的先出去(出队),后排队的后出去,排队时只能从队尾进入(不能插队),即入队。
特点
- 只允许在表的前端【front】进行删除操作,而在表的后端【rear】进行插入操作
- 进行插入操作的端称为队尾,进行删除操作的端称为队头
- 队列中没有元素时,称为空队列
- 先进先出(FIFO):只有最早进入队列的元素才能最先从队列中删除
基本功能
(1)头文件及宏定义:
#include <stdio.h>
#include <malloc.h>
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
拓展(c++):在c++中队列跟栈一样在STL中有其特定的标准库,可以直接用其中的函数,使用里面的函数就必须写上头文件 #include < queue >
(2)队列定义
typedef struct LNode
{
ElemType data;
struct LNode *next;
} LNode, *LinkList;
typedef struct
{
LinkList front, rear; /* 队头、队尾指针 */
} LinkQueue;
拓展(c++):c++中定义:queue < int > q;
(3)初始化
Status InitQueue(LinkQueue *Q)
{ /* 构造一个空队列Q */
LinkList p;
p = (LNode *)malloc(sizeof(LNode));
p->next = NULL;
(*Q).rear = (*Q).front = p;
return OK;
}
(4)检查队列长度
int QueueLenth(LinkQueue Q)
{
int n = 0;
LinkList p;
if (Q.rear == Q.front)
return 0;
p = Q.front->next;
while (p)
{
n++;
p = p->next;
}
return n;
}
拓展:c++中用 q.size()返回队列长度,用q.empty()来判断队列是否为空
(5)进队
Status QueueInsert(LinkQueue *Q, ElemType e)
{
LinkList p;
p = (LNode *)malloc(sizeof(LNode));
p->data = e;
p->next = NULL;
Q->rear->next = p;
Q->rear = p;
return OK;
}
拓展:c++中用q.pop()来删除队首元素,而用q.front()来返回队首元素
(6)出队
Status QueueDelete(LinkQueue *Q, ElemType *e)
{
if (Q->front == Q->rear)
return ERROR;
LinkList p = Q->front->next;
*e = p->data;
Q->front->next = p->next;
if (Q->rear == p)
Q->rear = Q->front;
free(p);
return OK;
}
拓展:c++中用q.push()来将元素入队,用q.back()来返回队尾元素得值
(7)遍历输出整个队列
Status List(LinkList L)
{
LinkList p;
if (!L)
return ERROR;
p = L->next;
while (p)
{
printf(" %d", p->data);
p = p->next;
}
printf("\n");
return OK;
}
队列中还有双向队列,优先队列等,值得我们学习,一起加油吧