数据结构之队列
有幸掌握浅薄知识,不吝分享,保持独立思考,自主学习,共同进步。另求关注,点赞,评论,感谢!(tips:主页有数据结构全部知识点,以及知识点讲解,建立完善的数据结构知识体)
核心算法思想
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
算法实现
链队列存储结构:
typedef struct qnode
{
int data;
struct qnode *next;
} QNode; //链队节点类型
typedef struct
{
QNode *front, *rear;
} QuType; //链队类型
创建空队列:
Status InitQueue (LinkQueue &Q) {
// 构造一个空队列Q,队头指针和队尾指针都指向头结点)
Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));
if (!Q.front) exit (OVERFLOW); //存储分配失败
Q.front->next = NULL;
return OK;
}
入队:
Status EnQueue (LinkQueue &Q, QElemType e)
{
// 插入元素e为Q的新队尾元素
p = (QueuePtr) malloc (sizeof (QNode)); //生成新结点
if (!p) exit (OVERFLOW); //存储分配失败
p->data = e; p->next = NULL; //插入队尾
Q.rear->next = p;
Q.rear = p; //修改队尾指针指向队尾
return OK;
}
出队:
Status DeQueue (LinkQueue &Q, QElemType &e)
{
// 若队列不空,则删除Q的队头元素,用 e 返回其值
if (Q.front == Q.rear) return ERROR; //判空
p = Q.front->next; e = p->data; //用e返回队头元素值
Q.front->next = p->next; //修改头指针始终指向队首元素
if (Q.rear == p) Q.rear = Q.front; //特殊情况处理空队
free (p); //释放队首结点
return OK;
}
实践出真知,代码案例
编写一个程序,实现链队的各种基本运算(假设队列中元素类型为char),并在此基础上设计一个程序完成如下功能:
(1)初始化链队q;
(2)判断链队q是否非空;
(3)依次进队元素a,b,c;
(4)出队一个元素,输出该元素;
(5)依次进链队元素d,e,f;
(6)输出出队序列;
(7)释放链队。
案例源码
#include <stdio.h>
#include <malloc.h>
typedef char ElemType;
typedef struct qnode
{
ElemType data;
struct qnode *next;
} QNode;
typedef struct
{
QNode *front;
QNode