【数据结构】队列
来源:互联网 发布:网页源码怎么修改 编辑:程序博客网 时间:2024/06/15 08:04
一、基础知识
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;
}
}
阅读全文
0 0
- 数据结构---队列
- 数据结构--队列
- 数据结构队列
- 数据结构---队列
- 数据结构(队列)
- 数据结构-队列
- 数据结构---->队列
- 数据结构---队列
- 【数据结构】队列
- 数据结构--队列
- 【数据结构】 队列
- 数据结构 -- 队列
- 数据结构--队列
- 数据结构:队列
- 数据结构 队列
- 数据结构----队列
- 数据结构----队列
- 数据结构-队列
- Windows SDK 按钮
- 【数据结构】栈
- JVM解读-调优常用参数
- 精确到月份的日历插件
- JVM解读-类加载机制
- 【数据结构】队列
- JavaMail核心API和主要的编程步骤(3)
- ueditor + springmvc + 阿里云aliyun oss 完美整合
- 【android x86 5.1.1】 adb install 流程分析
- 计数排序、选择排序、冒泡排序、插入排序的实现以及它们的比较次数和移动次数
- 我录制的《Java + JDBC + Freemarker引擎实现强大的代码生成器》视频教程,发布了
- 最短路径
- Flume定制实战
- Spark与Job Server整合原理与实战