当前位置: 首页 > 后端技术 > Java

数据结构队列,知识详解

时间:2023-04-01 13:55:10 Java

分类:什么是队列?队列有什么特点?队列名词解释队列类型队列操作详解正文:什么是队列?队列是一种特殊的线性表,它的特殊之处在于只允许在表的前端(front)进行删除操作,在表的后端(rear)进行插入操作。和栈一样,队列是一个受约束的线性列表的操作。插入操作结束的称为队尾,删除操作结束的称为队头。队列有什么特点?1.只允许在一端插入,在另一端删除2.遵循先进先出(FIFO)原则队列名词说明1.队列元素队列的数据元素也称为队列元素2.enqueue队列的数据元素也称为queuesElement3.Dequeue从队列中删除一个队列元素称为dequeue队列类型顺序队列定义:顺序队列结构必须静态分配或动态申请一块连续的存储空间,并且设置两个指针进行管理。一个是队头指针front,指向队头元素;另一个是队列尾指针rear,指向下一个入队元素的存储位置。操作逻辑:队尾每插入一个元素,rear加1;队头每删除一个元素,front加1。随着插入和删除操作的进行,队列元素的个数不断变化,队列占用的存储空间也在为分配的连续空间中移动队列结构。当front=rear时,队列中没有元素,称为空队列。当rear增加超过分配的连续空间时,队列不能再插入新的元素,但此时往往有大量空闲空间未被占用,这是已经被出队的队列元素占用的存储单元.顺序队列中的溢出现象:“Underflow”现象:当队列为空时,执行队列操作导致的溢出现象。“下溢”是正常现象,常被用作程序控制转移的条件。“真溢出”现象:当队列满时,进行push操作时会出现空间溢出现象。“真正溢出”是一种应该避免的错误情况。“假溢出”现象:由于在入队和出队操作中头尾指针只增不减,删除元素的空间永远无法再利用。当队列中的实际元素个数远小于向量空间的大小时,也有可能因为尾指针已经超过向量空间的上界,导致入队操作无法进行。这种现象称为“假溢出”现象。循环队列定义为了解决顺序队列的空间浪费,这里诞生了循环队列,循环队列可以复用队列空间。不管插入还是删除,一旦rear指针加1或者front指针加1超过分配的队列空间,就让它指向这个连续空间的起始位置。如果真的从MaxSize-1由1变为0,可以用rear%MaxSize和front%MaxSize取余运算来实现。这实际上把队列空间想象成一个环形空间,环形空间中的存储单元是循环使用的。这样管理的队列也称为循环队列。操作逻辑在循环队列中。当队列为空时,有front=rear,当所有队列空间已满时,也有front=rear。为了区分这两种情况,规定循环队列最多只能有MaxSize-1个队列元素。当循环队列中只剩下一个空存储单元时,队列已满。所以判断队列为空的条件是front=rear,判断队列满的条件是front=(rear+1)%MaxSize。队列操作序列队列操作代码:/***序列队列*/System.out.println("************序列队列***************");SequentialQueuesequentialQueue=newSequentialQueue<>(5,newString[5]);//判断是否为空队列System.out.println("判断是否为空队列:");System.出去。println(sequentialQueue.isEmpty());//入队sequentialQueue.inQueue("hello");sequentialQueue.inQueue("world!");sequentialQueue.inQueue("1!");sequentialQueue.display();//获取队列大小System.out.println("GetQueue尺寸:”);System.out.println(sequentialQueue.getSize());//获取队头S??ystem.out.println("获取队头:");System.out.println(sequentialQueue.getFront());//出队列System.out.println("顺序队列,出队列一次!");sequentialQueue.outQueue();//获取队列大小System.out.println("获取队列大小:");System.out.println(sequentialQueue.getSize());//获取队列头System.out.println("获取队头:");System.out.println(sequentialQueue.getFront());//判断是否为空队列System.out.println("判断是否为空队列:");系统tem.out.println(sequentialQueue.isEmpty());//显示队列sequentialQueue.display();sequentialQueue.inQueue("11");sequentialQueue.inQueue("12");sequentialQueue.display();Result:************顺序队列**************判断是否为空队列:true顺序队列,enqueue顺序队列helloworld!:显示队列:sequential队列你好世界!1!获取队列大小:5获取队头:顺序队列,1次出队!获取队列大小:4获取队列头:queue判断是否为空队列:false显示队列:queuehelloworld!1!显示队列:queuehelloworld!1!循环队列实际操作代码:/***Circularqueue*/System.out.println("**********CircularQueue***************");CircularQueuecircularQueue=newCircularQueue<>(10,newString[10]);//判断是否为空队列System.out.println("判断是否为空队列:");System.out.println(circularQueue.isEmpty());//入队.inQueue("hello");circularQueue.inQueue("world!");circularQueue。inQueue("5!");circularQueue.inQueue("6!");circularQueue.inQueue("7!");circularQueue.inQueue("8!");circularQueue.inQueue("9!");circularQueue.inQueue("10!");circularQueue.display();//获取队列大小System.out.println("获取队列大小:");System.out.println(circularQueue.getSize());//获取队头S??ystem.out.println("获取队头:");System.out.println(circularQueue.getFront());//出队System.out.println("循环队列,出队一次!");circularQueue.outQueue();//获取队列大小System.out.println("获取队列大小:");System.out.println(circularQueue.getSize());//获取队头S??ystem.out.println("获取队头:");System.out.println(circularQueue.getFront());//判断是否是一个emptyqueueSystem.out.println("判断是否为空队列:");System.out.println(circularQueue.isEmpty());//显示队列circularQueue.display();circularQueue.inQueue("10!");circularQueue.inQueue("11!");circularQueue.inQueue("12!");circularQueue.display();结果:********************CircularQueue**************判断是否为空队列:真循环队列,enqueue:显示队列:循环队列helloworld!5!6!7!8!9!获取队列大小:9获取队列头:循环循环队列,出队一次!获取队列大小:8获取队列头:queue判断队列是否为空:false显示队列:queuehelloworld!5!6!7!8!9!null显示队列:queuehelloworld!5!6!7!8!9!10!--------结尾------