队列(Queue)的链式存储结构以及双端队列的相关概念(C语言)
Posted bfhonor
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了队列(Queue)的链式存储结构以及双端队列的相关概念(C语言)相关的知识,希望对你有一定的参考价值。
一、队列(Queue)的链式存储结构
- 队列的链式实现
typedef struct LinkNode{ //链式队列结点
ElemType data;
struct LinkNode *next;
}LinkNode;
typedef struct{ //链式队列
LinkNode *front,*rear; //队列的队头和队尾指针
}LinkQueue;
(一)初始化
1. 初始化(带头结点)
typedef struct LinkNode{
ElemType data;
struct LinkNode *next;
}LinkNode;
typedef struct{ //链式队列
LinkNode *front,*rear; //队列的队头和队尾指针
}LinkQueue;
//初始化队列(带头结点)
void InitQueue(LinkQueue &Q){
//初始化 front、rear 都指向头结点
Q.front = Q,rear = (LinkNode*)malloc(sizeof(LinkNode));
Q.front -> next = NULL;
}
void testLinkQueue(){
LinkQueue Q; //声明一个队列
InitQueue(Q); //初始化队列
//...后继操作...
}
2.初始化(不带头结点)
//初始化队列(不带头结点)
void InitQueue(LinkQueue &Q){
//初始化时 front、rear都指向NULL
Q.front = NULL;
Q.rear = NULL;
}
(二)判断是否为空
1. 判断是否为空(带头结点)
//判断队列是否为空
bool IsEmpty(LinkQueue Q){
if(Q.front == Q.rear)
return true;
else
return false;
}
2.判断是否为空(不带头结点)
//判断队列是否为空(不带头结点)
bool IsEmpty(LinkQueue Q){
if(Q.front == NULL)
return true;
else
return false;
}
(三)入队
1. 入队(带头结点)
//新元素入队(带头结点)
void EnQueue(LinkQueue &Q,ElemType x){
LinkNode *s = (LinkNode *)malloc(sizeof(LinkNode));
s -> data = x;
s -> next = NULL;
Q.rear -> next = s; //新结点插入到rear之后
Q.rear = s; //修改表尾指针
}
2. 入队(不带头结点)
(三)出队
1. 带头结点
//队头元素出队(不带头结点)
bool DeQueue(LinkQueue &Q,ElemType &x){
if(Q.front == Q.rear)
return false; //空队
LinkNode *p = Q.front -> next;
x = p -> data; //用变量x返回队头元素
Q.front -> next = p -> next;//修改头结点的next指针
if(Q.rear == p) //此次时最后一个结点出队
Q.rear = Q.front; //修改rear指针
free(p); //释放结点空间
return true;
}
2. 不带头结点
(1)多个结点中删除一个结点
(2)还剩一个结点,然后进行删除
//队头元素出队(不带头结点)
bool DeQueue(LinkQueue &Q, ElemType &x){
if(Q.front == NULL)
return false; //空队
LinkNode *p = Q.front; //👈p指向此次出队的结点
x = p->data; //用变量x返回队头元素
Q.front = p->next; //👈修改front指针
if(Q.rear == p){ //此次是最后一个结点出队
Q.front = NULL; //👈front指向NULL
Q.rear = NULL; //👈rear指向NULL
}
free(p); //释放结点空间
return true;
}
(四)队列满的条件
二、双端队列
(一) 输入受限、输出受限
(二) 判断输出序列合法性
- 若数据元素输入序列为 1,2,3,4,则哪些输出序列是合法的,哪些是非法的?
1. 用“栈”方法实现
(1)2,4,1,3依次出栈(不合法)
(2)3,2,4,1依次出栈(合法)
2. 用“输入受限的双端队列”方法实现
(1)1,4,2,3依次出队(合法)
(2)4,2,3,1依次出队(合法)
3. 用“输出受限的双端队列”方法实现
(1)4,1,3,2依次出队(合法)
以上是关于队列(Queue)的链式存储结构以及双端队列的相关概念(C语言)的主要内容,如果未能解决你的问题,请参考以下文章
[数据结构-严蔚敏版]P61ADT Queue的表示与实现(单链队列-队列的链式存储结构)
C/C++数据结构-完整代码队列Queue(顺序存储,链式存储)增删改查