队列的顺序、链式表示与实现
上期说到栈,是一种“先进后出”的线性表,今天我们来剖析一下一种 “ 先进先出 ” 的数据结构:队列。
队列也有顺序表示和链式表示。
一、队列的顺序表示
1.队列的顺序存储结构
队列同样需要用头(head)尾(tail)指针
#define MAXSIZE 100
typedef struct{qelemType *base;//循环队列存储的基地址int head;//头指针int tail;//尾指针
}sqQueue;
2.初始化
(1)为队列动态分配一个大小为MAXSIZE的数组空间
(2)base指向数据空间的首地址
(3)头尾指针置0
#define status int
#define qelemType int
status init_Queue(sqQueue &Q){Q.base=new qelemType[MAXSIZE];if(!Q.base)return 0;Q.head=Q.tail=0;return 1;
}
3.获得队列长度
(1)对于非循环队列,头尾指针差值即为长度
(2)对于循环队列,差值可能<0,故差值加上MAXSIZE后在对MAXSIZE求余
Eg:head=5;tail=1;MAXSIZE=10;(head-tail)= -4;
进行上述操作得:length=6
int queue_Length(sqQueue Q){return(Q.tail-Q.head+MAXSIZE)%MAXSIZE;
}
4.入队
(1)判断队列是否满队
(2)将新元素插入队尾
(3)队尾指针+1
status queue_Insert(sqQueue &Q,qelemType e){if((Q.tail+1)%MAXSIZE==Q.head)return 0;Q.base[Q.tail]=e;Q.tail=(Q.tail+1)%MAXSIZE;return 1;
}
5.出队
(1)判断队列是否满队
(2)保存队头(head)
(3)队头指针+1
status queue_Delete(sqQueue &Q,qelemType &e){if(Q.head==Q.tail)return 0;e=Q.base[Q.head];Q.head=(Q.head+1) %MAXSIZE;return 1;
}
6.取队头元素
(1)判断队列是否为空,若不为空,执行一下操作
返回队头元素的值,头指针不变
#define selemType int
selemType get_Queue_Head(sqQueue Q){if(Q.head!=Q.tail)return Q.base[Q.head];
}
当用户无法提前获知队列的最大长度时,应采用队列的链式结构
二、队列的链式表示(通常用单链表表示)
注:与栈的链式存储表示不同的是,队列的链式表示需要两组指针
1.队列的链式存储结构
#define qelemType int
#define queuePointer int
typedef struct{qelemType data;//节点数据域struct QNode *next;//节点指针域
}QNode,*queuePointer;//queuePointer为指向qNode结构的指针类型typedef struct{queuePointer head;//头指针queuePointer tail;//尾指针
}queueLink;
2.初始化
(1)生成一个新的节点作为头结点
(2)队头与队尾指向这个新节点
(3)头结点指针域置空
#define status int
status init_Link_Queue(queueLink &Q){Q.head=Q.tail=new QNode;Q.head->next=NULL;//置空return 1;
}
3.入队
(1)用指针p指向即将入队的元素 并 动态分配内存空间
(2)新节点的数据域置为e
(3)将新节点插入到队尾
(4)将队尾指针修改为p
status link_Queue_Insert(queueLink &Q,qelemType e){queueLink p=new QNode;p->data=e;p->next=NULL;Q.head->next=p;Q.head=p;return 1;
}
4.出队
(1)判断队列是否为空
(2)保存队头元素的内存空间
(3)修改头节点的指针域,使其指向像一个节点
(4)判断出队元素是否为最后一个,若是,将尾指针重新赋值并指向头结点;若否(5)
(5)释放保存的队头元素的内存空间
status link_Queue_Delete(queueLink &Q,qelemType &e){queueLink p;if(Q.head==Q.tail)return 0;p=Q.head->next;e=p->data;Q.head->next=p->next;if(Q.head==p)Q.head=Q.tail;delete p;retunr 1;
}
5.取队头元素
(1)判断队列是否为空,若否(2)
(2)返回当前队头元素的value,队头指针不变
#define selemType int
selemType get_Link_Queue_Head(queueLink Q){if(Q.head!=Q.tail)return Q.head->next->data;
}
队列的顺序、链式表示与实现相关推荐
- 链式队列,队列篇(链式队列的出队入队操作)
数据结构,队列篇(链式队列) 前言: 上一篇博主简单讲解了顺序队列和循环队列,今天讲解队列最后一篇链式队,链式队在数据结构中用到比较多,用来做一些排队的算法,还有链式队列是也是和链式栈一样采用链表的方 ...
- 数据结构---线性表的静态/动态分配与顺序/链式存储
线性表---基于严魏敏版数据结构c语言实现---谭浩强版c语言 数据元素在计算机中的存储分为顺序存储和链式存储 顺序存储:借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系 链式存储:借助指示元 ...
- 链式存储结构 php,【PHP 实现数据结构】链式队列
什么是链式队列 队列是一种"先进先出"的存储结构,是一种特殊的线性表,于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作. 通常队列可以分为顺序队 ...
- c语言建立队列(顺序队列、循化队列和链式队列)
c语言建立队列 一.顺序队列 队列的顺序存储结构 顺序队列的讨论 "下溢"现象 "真上溢"现象 "假上溢"现象 二.如何解决"假上 ...
- c语言队列(顺序队列,循环队列,链式队列)
顺序队列 1.初始化: front=-1; rear=-1; 2.判空条件 font=rear; 3.队列已满条件 rear=max-1; 代码: #include<stdio.h> #i ...
- 数据结构(二):线性表包括顺序存储结构(顺序表、顺序队列和顺序栈)和链式存储结构(链表、链队列和链栈)...
还记得数据结构这个经典的分类图吧: 今天主要关注一下线性表. 什么是线性表 线性表的划分是从数据的逻辑结构上进行的.线性指的是在数据的逻辑结构上是线性的.即在数据元素的非空有限集中 (1) 存在唯一的 ...
- 数据结构之顺序队列和链式队列常用的一些操作
顺序队列是队列的顺序存储结构,顺序队列实际上是运算受限的顺序表.和顺序表一样,顺序队列用一个向量空间来存放当前队列中的元素.由于队列的队头和队尾的位置是变化的,设置两个指针front和rear分别指示 ...
- java链式结构_java语言实现队列顺序结构与链式结构
本文主要向大家介绍了java语言实现队列顺序结构与链式结构,通过具体的内容向大家展示,希望对大家学习java语言有所帮助. 队列的顺序存储结构实现 public class Queue{ privat ...
- 利用 队列 来实现医院挂号模拟看病系统(c++,顺序及链式)
//一,顺序队列(麻烦&&锻炼自己能力) #include<iostream> using namespace std; typedef struct{int *elem; ...
最新文章
- 强化学习大规模应用还远吗?Youtube推荐已强势上线
- 排序算法四:归并排序
- vs2008中xlslib与libxls库的编译及使用
- 信用卡多还钱了怎么办?
- 可视化流程设计器 Activiti Designer
- hibernate CascadeType属性说明
- 中控指纹考勤机软件登录用户名和密码忘记的解决办法
- termux python教程_Termux 入门教程:架设手机 Server 下载文件
- 关于汉王 唐人笔手写板 打开后间歇性手写程序闪退以及屏幕锁屏或者关闭后手写板自动usb拔出问题
- 计算机图形图像设计构图的基本形式,构图一学就会!构图基本形式只有四种
- 为什么当函数值为定值时,梯度垂直于等值面?
- 木瓜移动每日出海快讯0428:谷歌发布Q1财报
- w10更新以后DNS服务器未响应,图文详解win10系统dns服务器未响应的措施
- Bose Soundlink Ⅲ 随机断电故障处理
- Word中表格相关的操作
- windows 环境 ngrok内网穿透外网
- 记一次mysql启动失败问题.
- 读安晓辉之《Qt Quick 核心编程》
- 非计算机专业人员的程序之路
- 顶级React开发工具
热门文章
- RocketMQ重试机制(ACK确认机制)
- SQL经典50查询语句(面试题)案例2
- 美食杰 login的实现效果
- open函数里的newline
- 西南民族大学第十届校赛 题解
- linux mysql5.7免安装版配置_MySQL5.7免安装版配置
- 游戏画质提升1《X战警金刚狼前传》画质增强修改
- has been injected into other beans[XXXXXXXXXX] in its raw version as part of a circular reference
- Java面向对象day03
- 用C 制作含万年历的台历(2009年样张)之1