我们在学习的阶段时,对一些数据结构的概念、用法,比如:队列。总是不那么熟悉,相信大部分初学者都感同身受,所以在此,我向大家分享一下自己如何将队列的概念、用法融汇贯通的。
对于数据结构中队列的学习,我认为可以分三个阶段:
1.字面理解阶段:
队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表。
(1)允许删除的一端称为队头(head)。
(2)允许插入的一端称为队尾(last)。
(3)当队列中没有元素时称为空队列。
(4)队列亦称作先进先出(First In First Out)的线性表,简称为FIFO表。
队列的修改是依先进先出的原则进行的。新来的成员总是加入队尾(即不允许"加塞"),每次离开的成员总是队列头上的(不允许中途离队[不能插队]),即当前"最老的"成员离队。
【例】在队列中依次加入元素a1,a2,…,an之后,a1是队头元素,an是队尾元素。退出队列的次序只能是a1,a2,…,an。
图例:
2、画图理解阶段与3、实现理解阶段
1)先确定存储数据的容器。
a、基于数组
//定义一个储存数据的数组,初始化长度为0 Object[] src = new Object[0];
b、基于链表
/** * 链式结构内部结点类,双链表 * * @author Administrator * */ class SNODE<E> { // 内容 E data; // 对下一个结点的引用 SNODE<E> netx = null; // 对下一个结点的引用 SNODE<E> front = null; //空的构造函数,用于构造空值的结点 public SNODE() { } //构造有值的结点 public SNODE(E e) { data = e; } } //定义一个储存数据的链表,头结点初始值为null public SNODE<E> head = null; //尾结点初始值为null private SNODE<E> last = null; //定义一个变量保存栈的长度 private int num = 0;
2)增加操作
a、基于数组
图例:
图例解析:将数组src全部复制到数组dest中,再将新数据添到数组dest的最后一位,最后将数组dest赋予数组src,还原数组。
/** * 将数据压入队列 * @param e 压入数据 */ public void put(E e){ //新建一个临时数组dest,长度比数组src大1 Object[] dest = new Object[src.length+1]; //将增加的数据添到数组dest的末尾 dest[src.length]=e; //将数组src的数据复制到数组dest中 System.arraycopy(src, 0, dest, 0, src.length); //将临时数组dest赋予数组src,还原数组src src=dest; }
b、基于链表
图例:
图例解析:先将尾节点last的next指向新结点node
再将新结点node的front指向尾节点last
再将尾节点last指向新结点node
/** * 将数据放入队列 * * @param e * 放入数据 */ public void put(E e) { //建立一个新结点node,值为e,默认无指向 SNODE<E> node = new SNODE<E>(e); //如果栈内没有数据 if (head == null) { //头结点指向新结点node head = node; //尾结点指向新结点node last = node; //node结点的front指向null node.front = null; //node结点的netx指向null node.netx = null; } else { //将尾节点last的netx指向新结点node last.netx=node; //新结点node的front指向last node.front = last; //新结点node的netx指向null node.netx=null; //尾节点last后移一位 last = node; } //栈的长度+1 num++; }
3)删除操作
a、基于数组
图例:
图例解析:将数组src从第二个全部复制到数组dest[下标从0开始]中,再将新数据赋予临时变量e,最后将数组dest赋予数组src,还原数组,返回输出e。
/** * 将队列底部数据弹出来 * @return 队列底部数据 */ public E poll(){ //新建一个临时数组dest,长度比数组src小1 Object[] dest = new Object[src.length-1]; //将数组src的数据复制到数组dest中,不包括数组src的第一个元素,其他的元素依次复制到数组dest对应位置 System.arraycopy(src, 1, dest, 0, dest.length); //定义一个临时变量装数组src的第一个元素 E e=(E)src[0]; //将临时数组dest赋予数组src,还原数组src src=dest; //返回临时变量e return e; }
b、基于链表
图例:
图例解析:先将新结点node指向头结点head
再将头节点head指向新结点node的下一个结点
再将旧头结点的next置为空,新头结点的front置为空,最后返回输出旧头结点的值
/** * 将队列底部数据取出来 * * @return 队列底部数据 */ public E poll() { //如果栈内有数据 if (head.data!= null) { //建立一个新结点node,值为空,默认无指向 SNODE<E> node = new SNODE<E>(); // 将node指向头结点 node = head; // 头结点head的指向移到下一个结点 head = node.netx; // 旧头结点的指向关系为null node.netx = null; // 新头结点的指向关系为null head.front = null; //栈长度-1 num--; //返回输出原队列顶部的数据 return node.data; } //栈内没有数据就返回输出null return null; }
4)判断队列是否为空
/** * 获得队列长度,基于链表实现[基于数组实现:num改成src.length] * * @return 队列长度 */ public int size() { //返回栈的长度 return num; }
5)获得队列长度
/** * 判断队列是否为空,基于链表实现[基于数组实现:num改成src.length] * * @return true/false */ public boolean isEmpty() { //如果栈长度是0就返回false if (num == 0) { return true; } else {//否则就返回true return false; } }
相关推荐
#### 一、什么是消息队列? 消息队列是一种在消息的传输过程中用于保存消息的容器。这里的“消息”指的是在两台计算机之间传送的数据单元,它可以是非常简单的文本字符串,也可以是包含复杂结构的数据包,比如包含...
### C语言实现链式队列的基本操作 #### 一、链式队列简介 链式队列是一种基于链表的数据结构,它具有队列的基本特性,即...通过对这些基本操作的理解和实现,可以帮助开发者更好地掌握链式队列的应用场景和技术细节。
Java中的队列是一种数据结构,它遵循先进先出(FIFO)原则,即最先插入的元素将是最先被删除的。...队列是许多算法和并发编程场景的基础,如生产者消费者模型、多线程同步等,因此深入理解和掌握队列的实现至关重要。
以上就是链队列的基本操作实现,这些操作对于理解和处理各种数据结构问题至关重要,特别是在需要按先进先出(FIFO)原则进行操作的场景中。通过熟练掌握这些基础操作,可以进一步解决更复杂的算法问题。在实际编程中...
在消息队列(Message Queue,简称MQ)的学习过程中,理解和掌握本地队列与远程队列的使用是至关重要的。本地队列指的是在同一系统上创建并管理的消息队列,而远程队列则是指跨系统的消息传递。本文将通过具体的实例...
在IT领域,数据结构是计算机科学的基础,而队列作为一种基本的数据结构,有着广泛的应用。...通过阅读和理解这些源代码,开发者可以加深对队列原理的理解,并能灵活运用到各种算法和系统设计中去。
在本实例中,不仅展示了如何创建和操作这两种队列,还演示了队列中元素的变化过程,帮助理解队列的工作机制。此外,实例还结合了栈这一数据结构来判断字符串是否为回文。栈是一种后进先出(LIFO,Last In First Out...
队列是一种特殊的线性数据结构,...为了理解和学习这部分内容,你需要阅读源代码,理解其中的数据结构定义、队列操作函数以及逆置算法的细节。通过运行`实验1_2_2.exe`,你可以验证代码的正确性,观察队列逆置的效果。
为了更好地理解队列的工作原理,练习可能还包含了循环结构,比如“For Loop”或“While Loop”,以便反复进行入队和出队的操作。此外,可能还会使用“显示”控件或图表来实时显示队列的状态,如队列的长度、当前队首...
在Android开发中,数据结构和算法的掌握是提升应用程序效率的关键。循环队列是一种常见的线性...通过实践`QueueDemo`项目,你不仅可以深入理解循环队列的工作原理,还能提高编程技能,为未来的开发工作打下坚实的基础。
顺序队列和链队列 顺序队列和链队列是数据结构中两种常见的队列实现方式,分别使用数组和链表来存储...本文通过实验和分析,详细介绍了顺序队列和链队列的操作和优缺,希望能够帮助读者更好地理解和应用这些数据结构。
数据结构 队列部分 队列的删除等相关操作 队列是一种特殊的线性表,它遵循先进先出(First-In-First-Out,FIFO)原则。队列的操作主要有三个:...通过对队列的理解,我们可以更好地理解和应用队列在实际问题中的应用。
这些问题可以帮助我们更好地理解栈和队列的基本操作。 在实验小结中,我们需要总结本次实验的重难点及心得、体会、收获。我们可以通过实验,掌握了栈和队列的知识,又学会了一些基本应用实例,例如括号匹配、回文...
在提供的"**GCD 队列理解 Demo**"中,你可以找到更多关于如何创建和使用队列及任务的实例代码。通过分析和运行这些示例,你会对GCD有更深入的理解。 总之,GCD是iOS开发中处理并发问题的强大工具。正确理解和使用...
在本程序中,我们主要关注链式队列的六个核心操作,这些操作对于理解和应用链式队列至关重要。 1. **入队(Enqueue)**:入队操作是将一个元素添加到队列的尾部。在链式队列中,由于链表的特性,我们可以轻松地添加...
循环队列是一种线性数据结构,它在计算机科学中被广泛应用于数据缓存、消息队列等场景。相比于传统的队列,循环队列利用数组的...理解并掌握循环队列,对于提升编程能力尤其是处理并发和数据缓存等问题时,大有裨益。
首先,理解队列的基本操作是至关重要的。在LabVIEW中,队列可以通过“容器”类别下的“队列”函数创建。创建队列后,你可以使用“入队”(Enqueue)函数将数据放入队列,而“出队”(Dequeue)函数则用于取出队列中...
首先,我们需要理解消息队列的基本概念。消息队列允许应用程序之间通过异步消息传递进行通信,而不必同时在线。发送方将消息放入队列,接收方则在准备好处理时从队列中取出消息。这种模式减少了系统的直接依赖性,...
首先,我们来理解一下队列的基本概念。队列是一种先进先出(FIFO, First In First Out)的数据结构,它的操作类似于现实生活中的排队,第一个进入队列的元素也将是第一个离开队列的。在LabVIEW中,队列常用于存储和...