上期说到栈,是一种“先进后出”的线性表,今天我们来剖析一下一种 “ 先进先出 ” 的数据结构:队列。

队列也有顺序表示和链式表示。

一、队列的顺序表示

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;
}

队列的顺序、链式表示与实现相关推荐

  1. 链式队列,队列篇(链式队列的出队入队操作)

    数据结构,队列篇(链式队列) 前言: 上一篇博主简单讲解了顺序队列和循环队列,今天讲解队列最后一篇链式队,链式队在数据结构中用到比较多,用来做一些排队的算法,还有链式队列是也是和链式栈一样采用链表的方 ...

  2. 数据结构---线性表的静态/动态分配与顺序/链式存储

    线性表---基于严魏敏版数据结构c语言实现---谭浩强版c语言 数据元素在计算机中的存储分为顺序存储和链式存储 顺序存储:借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系 链式存储:借助指示元 ...

  3. 链式存储结构 php,【PHP 实现数据结构】链式队列

    什么是链式队列 队列是一种"先进先出"的存储结构,是一种特殊的线性表,于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作. 通常队列可以分为顺序队 ...

  4. c语言建立队列(顺序队列、循化队列和链式队列)

    c语言建立队列 一.顺序队列 队列的顺序存储结构 顺序队列的讨论 "下溢"现象 "真上溢"现象 "假上溢"现象 二.如何解决"假上 ...

  5. c语言队列(顺序队列,循环队列,链式队列)

    顺序队列 1.初始化: front=-1; rear=-1; 2.判空条件 font=rear; 3.队列已满条件 rear=max-1; 代码: #include<stdio.h> #i ...

  6. 数据结构(二):线性表包括顺序存储结构(顺序表、顺序队列和顺序栈)和链式存储结构(链表、链队列和链栈)...

    还记得数据结构这个经典的分类图吧: 今天主要关注一下线性表. 什么是线性表 线性表的划分是从数据的逻辑结构上进行的.线性指的是在数据的逻辑结构上是线性的.即在数据元素的非空有限集中 (1) 存在唯一的 ...

  7. 数据结构之顺序队列和链式队列常用的一些操作

    顺序队列是队列的顺序存储结构,顺序队列实际上是运算受限的顺序表.和顺序表一样,顺序队列用一个向量空间来存放当前队列中的元素.由于队列的队头和队尾的位置是变化的,设置两个指针front和rear分别指示 ...

  8. java链式结构_java语言实现队列顺序结构与链式结构

    本文主要向大家介绍了java语言实现队列顺序结构与链式结构,通过具体的内容向大家展示,希望对大家学习java语言有所帮助. 队列的顺序存储结构实现 public class Queue{ privat ...

  9. 利用 队列 来实现医院挂号模拟看病系统(c++,顺序及链式)

    //一,顺序队列(麻烦&&锻炼自己能力) #include<iostream> using namespace std; typedef struct{int *elem; ...

最新文章

  1. 强化学习大规模应用还远吗?Youtube推荐已强势上线
  2. 排序算法四:归并排序
  3. vs2008中xlslib与libxls库的编译及使用
  4. 信用卡多还钱了怎么办?
  5. 可视化流程设计器 Activiti Designer
  6. hibernate CascadeType属性说明
  7. 中控指纹考勤机软件登录用户名和密码忘记的解决办法
  8. termux python教程_Termux 入门教程:架设手机 Server 下载文件
  9. 关于汉王 唐人笔手写板 打开后间歇性手写程序闪退以及屏幕锁屏或者关闭后手写板自动usb拔出问题
  10. 计算机图形图像设计构图的基本形式,构图一学就会!构图基本形式只有四种
  11. 为什么当函数值为定值时,梯度垂直于等值面?
  12. 木瓜移动每日出海快讯0428:谷歌发布Q1财报
  13. w10更新以后DNS服务器未响应,图文详解win10系统dns服务器未响应的措施
  14. Bose Soundlink Ⅲ 随机断电故障处理
  15. Word中表格相关的操作
  16. windows 环境 ngrok内网穿透外网
  17. 记一次mysql启动失败问题.
  18. 读安晓辉之《Qt Quick 核心编程》
  19. 非计算机专业人员的程序之路
  20. 顶级React开发工具

热门文章

  1. RocketMQ重试机制(ACK确认机制)
  2. SQL经典50查询语句(面试题)案例2
  3. 美食杰 login的实现效果
  4. open函数里的newline
  5. 西南民族大学第十届校赛 题解
  6. linux mysql5.7免安装版配置_MySQL5.7免安装版配置
  7. 游戏画质提升1《X战警金刚狼前传》画质增强修改
  8. has been injected into other beans[XXXXXXXXXX] in its raw version as part of a circular reference
  9. Java面向对象day03
  10. 用C 制作含万年历的台历(2009年样张)之1