队列(Queue)的链式存储结构以及双端队列的相关概念(C语言)

数据结构(C语言) 专栏收录该内容
29 篇文章 3 订阅

一、队列(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依次出队(合法)

在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 1
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 数字50 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值