`
LQJ2711
  • 浏览: 5491 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

如何理解队列?

 
阅读更多

我们在学习的阶段时,对一些数据结构的概念、用法,比如:队列。总是不那么熟悉,相信大部分初学者都感同身受,所以在此,我向大家分享一下自己如何将队列的概念、用法融汇贯通的。

对于数据结构中队列的学习,我认为可以分三个阶段:

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

 
 

  • 大小: 8.9 KB
  • 大小: 16.6 KB
  • 大小: 9 KB
  • 大小: 12.7 KB
  • 大小: 18.8 KB
分享到:
评论

相关推荐

    消息队列如何理解?

    #### 一、什么是消息队列? 消息队列是一种在消息的传输过程中用于保存消息的容器。这里的“消息”指的是在两台计算机之间传送的数据单元,它可以是非常简单的文本字符串,也可以是包含复杂结构的数据包,比如包含...

    C语言_初始化队列+入队列+出队列+销毁队列

    ### C语言实现链式队列的基本操作 #### 一、链式队列简介 链式队列是一种基于链表的数据结构,它具有队列的基本特性,即...通过对这些基本操作的理解和实现,可以帮助开发者更好地掌握链式队列的应用场景和技术细节。

    java队列实现(顺序队列、链式队列、循环队列)

    Java中的队列是一种数据结构,它遵循先进先出(FIFO)原则,即最先插入的元素将是最先被删除的。...队列是许多算法和并发编程场景的基础,如生产者消费者模型、多线程同步等,因此深入理解和掌握队列的实现至关重要。

    链队列题目:初始化队列+入队列+出队列+销毁队列

    以上就是链队列的基本操作实现,这些操作对于理解和处理各种数据结构问题至关重要,特别是在需要按先进先出(FIFO)原则进行操作的场景中。通过熟练掌握这些基础操作,可以进一步解决更复杂的算法问题。在实际编程中...

    MQ入门实例(本地队列&远程队列 两个例子)

    在消息队列(Message Queue,简称MQ)的学习过程中,理解和掌握本地队列与远程队列的使用是至关重要的。本地队列指的是在同一系统上创建并管理的消息队列,而远程队列则是指跨系统的消息传递。本文将通过具体的实例...

    C语言实现队列源码,包含顺序队列,链式队列,循环队列,亲测可用

    在IT领域,数据结构是计算机科学的基础,而队列作为一种基本的数据结构,有着广泛的应用。...通过阅读和理解这些源代码,开发者可以加深对队列原理的理解,并能灵活运用到各种算法和系统设计中去。

    泛型顺序队列和循环队列

    在本实例中,不仅展示了如何创建和操作这两种队列,还演示了队列中元素的变化过程,帮助理解队列的工作机制。此外,实例还结合了栈这一数据结构来判断字符串是否为回文。栈是一种后进先出(LIFO,Last In First Out...

    队列建立和队列的逆置

    队列是一种特殊的线性数据结构,...为了理解和学习这部分内容,你需要阅读源代码,理解其中的数据结构定义、队列操作函数以及逆置算法的细节。通过运行`实验1_2_2.exe`,你可以验证代码的正确性,观察队列逆置的效果。

    入队列出队列练习_Labview队列的使用_labview队列_

    为了更好地理解队列的工作原理,练习可能还包含了循环结构,比如“For Loop”或“While Loop”,以便反复进行入队和出队的操作。此外,可能还会使用“显示”控件或图表来实时显示队列的状态,如队列的长度、当前队首...

    Android之循环队列操作

    在Android开发中,数据结构和算法的掌握是提升应用程序效率的关键。循环队列是一种常见的线性...通过实践`QueueDemo`项目,你不仅可以深入理解循环队列的工作原理,还能提高编程技能,为未来的开发工作打下坚实的基础。

    顺序队列和链队列

    顺序队列和链队列 顺序队列和链队列是数据结构中两种常见的队列实现方式,分别使用数组和链表来存储...本文通过实验和分析,详细介绍了顺序队列和链队列的操作和优缺,希望能够帮助读者更好地理解和应用这些数据结构。

    数据结构 队列部分 队列的删除等相关操作

    数据结构 队列部分 队列的删除等相关操作 队列是一种特殊的线性表,它遵循先进先出(First-In-First-Out,FIFO)原则。队列的操作主要有三个:...通过对队列的理解,我们可以更好地理解和应用队列在实际问题中的应用。

    栈和队列的基本操作

    这些问题可以帮助我们更好地理解栈和队列的基本操作。 在实验小结中,我们需要总结本次实验的重难点及心得、体会、收获。我们可以通过实验,掌握了栈和队列的知识,又学会了一些基本应用实例,例如括号匹配、回文...

    GCD 总结-队列和任务的理解

    在提供的"**GCD 队列理解 Demo**"中,你可以找到更多关于如何创建和使用队列及任务的实例代码。通过分析和运行这些示例,你会对GCD有更深入的理解。 总之,GCD是iOS开发中处理并发问题的强大工具。正确理解和使用...

    链式队列的基本运算

    在本程序中,我们主要关注链式队列的六个核心操作,这些操作对于理解和应用链式队列至关重要。 1. **入队(Enqueue)**:入队操作是将一个元素添加到队列的尾部。在链式队列中,由于链表的特性,我们可以轻松地添加...

    循环队列的总结

    循环队列是一种线性数据结构,它在计算机科学中被广泛应用于数据缓存、消息队列等场景。相比于传统的队列,循环队列利用数组的...理解并掌握循环队列,对于提升编程能力尤其是处理并发和数据缓存等问题时,大有裨益。

    队列VI_labview队列_vi_labview_队列VI_

    首先,理解队列的基本操作是至关重要的。在LabVIEW中,队列可以通过“容器”类别下的“队列”函数创建。创建队列后,你可以使用“入队”(Enqueue)函数将数据放入队列,而“出队”(Dequeue)函数则用于取出队列中...

    C#消息队列发送及接收

    首先,我们需要理解消息队列的基本概念。消息队列允许应用程序之间通过异步消息传递进行通信,而不必同时在线。发送方将消息放入队列,接收方则在准备好处理时从队列中取出消息。这种模式减少了系统的直接依赖性,...

    ComQueue.rar_labview 队列_labview串口队列_串口 队列

    首先,我们来理解一下队列的基本概念。队列是一种先进先出(FIFO, First In First Out)的数据结构,它的操作类似于现实生活中的排队,第一个进入队列的元素也将是第一个离开队列的。在LabVIEW中,队列常用于存储和...

Global site tag (gtag.js) - Google Analytics