队列(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(顺序存储,链式存储)增删改查

队列文档之双端队列

C/C++数据结构-完整代码队列Queue(顺序存储,链式存储)增删改查

数据结构-队列-顺序链式存储

数据结构 Java数据结构 栈和队列 以及LeetCode相关面试题