一、基础知识
1.队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。
2.队列是一种先进先出的线性表。
3.与栈相同,队列也是一种重要的线性结构,实现一个队列同样需要顺序表或链表作为基础。
4.栈我们一般用顺序表来实现,而队列我们常用链表来实现,简称为链队列。
二、队列的链式存储结构
将队头指针front指向链队列的头结点,队尾指针rear指向终端结点。
空队列时,队头指针front和队尾指针rear都指向头结点。
typedef char ElemType;
typedef struct Qnode //结点结构
{
ElemType data;
struct Qnode *next;
}Qnode;
typedef struct Qnode * QueuePtr; //指向结点结构的指针
typedef struct //队列的链表结构
{
QueuePtr front; //队头指针
QueuePtr rear; //队尾指针
}LinkQueue;
三、创建一个队列
Step.1 在内存中生成一个头结点。
Step.2 将队列的头指针和尾指针指向这个生成的头结点。
//创建一个队列
void InitQueue(LinkQueue *q)
{
q->front = q->rear = (QueuePtr)malloc(sizeof(Qnode));
if (!q->front)
{
exit(0);
}
q->front->next = NULL;
}
四、入队列操作(尾部插入)
- //入队列操作
void InsertQueue(LinkQueue *q, ElemType e)
{
QueuePtr p;
p = (QueuePtr)malloc(sizeof(Qnode));
if (!p)
{
exit(0);
}
p->data = e;
p->next = NULL;
q->rear->next = p;
q->rear = p;
}
五、出队列操作(头部删除)
//出队列操作
void DeleteQueue(LinkQueue *q, ElemType *e)
{
QueuePtr p;
if (q->front = q->rear) //空队列
{
return;
}
p = q->front->next;
*e = p->data;
q->front->next = p->next;
if (q->rear = p) //原队列只有一个元素的情况,删除该节点,队列为空队列
{
q->rear = q->front;
}
free(p);
}
六、销毁一个队列
由于链队列建立在内存的动态区,因此当一个队列不再有用时,应该及时将他销毁,以免过多的占用内存空间。
//销毁一个队列
void DestoryQueue(LinkQueue *q)
{
while (q->front)
{
q->rear = q->front->next; //从头向后删
free(q->front);
q->front = q->rear;
}
}
七、求队列的长度
//求队列长度
int LenQueue(LinkQueue *q)
{
QueuePtr t = q->front->next;
int len = 0;
while (t)
{
t = t->next;
len++;
}
return len;
}
八、判断队列是否为空
//判断队列是否为空
bool EmptyQueue(LinkQueue *q)
{
if (q->front == q->rear)
return true;
else
return false;
}
九、输出队列元素
//输出队列元素
void DisQueue(LinkQueue *q)
{
QueuePtr p = q->front->next;
printf("此时的链队列输出:\n");
while (p)
{
printf("%c", p->data);
p = p->next;
}
printf("\n");
}
十、获取队首、队尾元素
//获取队首元素
ElemType QueueFront(LinkQueue *q)
{
return q->front->data;
}
//获取队尾元素
ElemType QueueRear(LinkQueue *q)
{
return q->rear->data;
}
十一、创建一个长度由自己决定的队列并初始化队列
//创建一个长度由自己确定的队列并初始化
void CreateQueue(LinkQueue *q)
{
ElemType d;
int len, i;
QueuePtr p;
printf("请输入队列的长度:");
scanf("%d", &len);
for (i = 0; i < len; i++)
{
p = (QueuePtr)malloc(sizeof(Qnode));
if (!p)
{
exit(0);
}
scanf("%c", &d);
p->data = d;
p->next = NULL;
q->rear->next = p;
q->rear = p;
}
}