IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构:队列(王道2022) -> 正文阅读

[数据结构与算法]数据结构:队列(王道2022)

队列(Queue)是只允许在一端进行插入,在另一端删除的线性表

插入:入队
删除:出队

重要术语:
队头:允许删除的一端
队尾:允许插入的一端
空队列

//初始化队列,构造一个空队列
InitQueue(&Q);

//销毁队列。销毁并释放队列Q所占用的内存空间
DestroyQueue(&Q);

//入队,若队列Q未满,将x加入,使之成为新的队尾(增) 
EnQueue(&Q,x);

//出队,若队列Q非空,删除队头元素,并用x返回(删) 
DeQueue(&Q,&x);

//读队头元素,若队列Q非空,则将队头元素赋值给x (查) 
Get(Q,&x); 

顺序存储队列

定义

#define MaxSize 10  //定义队列中元素的最大个数 
typedef struct {
	ElemType data[MaxSize]; //用静态数组存放队列元素 
	int front,rear; //队头指针和队尾指针 
}SqQueue;

初始化

void InitQueue(SqQueue &Q){
	//初始时,队头,队尾指针指向0 
	Q.front = Q.rear = 0;
} 

入队

//入队
bool EnQueue(SqQueue &Q,ElemType x){
	if((Q.rear+1)%MaxSize == Q.front) //缺点,会牺牲一个单元 
		return false; //队满就报错 
	Q.data[Q.rear] = x; //新元素插入队尾 
	Q.rear = (Q.rear+1)%MaxSize; //队尾指针加1取模 
	return true; 
} 

出队

// 出队(删除一个队头元素,并用x返回)
bool DeQueue(SqQueue &Q,ElemType &x){
	if(Q.rear == Q.front){
		return false; //队空则报错 
	}
	x = Q.data[Q.front];
	Q.front = (Q.front+1)%MaxSize;
	return true; 
} 

获取队头元素的值

//获取队头元素的值,赋值给x 
bool Get(SqQueue Q,ElemType &x){
	if(Q.rear == Q.front){
		return false; //队空则报错 
	}
	x = Q.data[Q.front];
	return true; 
}

判断队列已满/已空(重点)

队列已满条件:队尾指针再下一个位置是队头。

(Q.rear+1)%MaxSize == Q.front

队空条件:

Q.rear == Q.front

链式存储队列

定义

typedef struct LinkLNode{
	ElemType data;
	struct LinkNode *next;
}LinkNode; 

typedef struct{ //链式队列 
	LinkNode *front,*rear; //队列的队头和队尾指针 
}LinkQueue;  

初始化(带头节点)

//初始化(带头节点) 
void InitQueue(LinkQueue &Q){
	Q.front = Q.rear = (LinkNode*)malloc(sizeof(LinkNode));
	Q.front->next = NULL;
}

判空

//判断队列是否为空
bool IsEmpty(LinkQueue Q){
	if(Q.front == Q.rear){
		return true;
	}else{
		return false;
	}
} 

或者

//判断队列是否为空
bool IsEmpty(LinkQueue Q){
	if(Q.front->next = NULL){
		return true;
	}else{
		return false;
	}
} 

初始化(带头节点)

//初始化(不带头节点) 
void InitQueue(LinkQueue &Q){
	Q.front = Q.rear = (LinkNode*)malloc(sizeof(LinkNode));
	Q.front = Q.rear = NULL;
}

判空

//判断队列是否为空
bool IsEmpty(LinkQueue Q){
	if(Q.front = NULL){
		return true;
	}else{
		return false;
	}
}

入队(带头节点)

//入队(带头节点)
bool 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; //修改表尾指针 
	return true; 
}

入队(不带头节点)

//入队(不带头节点)
bool EnQueue(LinkQueue &Q,ElemType x){
	LinkNode *s = (LinkNode*)malloc(sizeof(LinkNode));
	s->data = x;
	s->next = NULL;
	if(Q.front == NULL){ //不带头节点的队列,第一个元素入队时需要特别处理 
		Q.front = s;
		Q.rear = s;
	}else{
		Q.rear->next = s; //新节点插入到rear之后 
	Q.rear = s; //修改表尾指针 
	}
	return true; 
}

出队(带头节点)

//出队(带头结点)
bool DeQueue(LinkQueue &Q,ElemType &x){
	if(Q.front == Q.rear){
		return false; //空队 
	}
	LinkNode *p = Q.front->next;
	x = p->data;
	Q.front->next = p->next; //修改头结点的next指针 
	if(Q.rear == p){ //此次时最后一个结点出队 
		Q.rear = Q.front; //修改rear指针 
	} 
	free(p); //释放结点空间 
	return true;
} 

出队(不带头节点)

//出队(不带头结点)
bool DeQueue(LinkQueue &Q,ElemType &x){
	if(Q.front == NULL){
		return false; //空队 
	}
	LinkNode *p = Q.front;
	x = p->data;
	Q.front = p->next; //修改头结点的next指针 
	if(Q.rear == p){ //此次时最后一个结点出队 
		Q.rear = Q.front = NULL; //修改rear指针 
	} 
	free(p); //释放结点空间 
	return true;
} 

队列满的条件

一般不会队满,比顺序存储要好

双端队列(考察过)

双端队列:只允许从两端插入,两端删除的线性表

输入受限的双端队列

只允许从一端插入、两端删除的线性表

输出受限的双端队列

只允许从两端插入、一端删除的线性表

考点:判断输出序列的合法性

输入序列为1,2,3,4 合法性(栈、队列)

在这里插入图片描述
输入受限的双端队列,栈中合法,双端队列一定合法。

输出受限的双端队列,栈中合法,双端队列一定合法。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-02 11:02:29  更:2021-08-02 11:03:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 18:53:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码