当前位置: 首页 > news >正文

数据结构——队列(Java)

一.基本概念

队列用来存储逻辑关系为“一对一”的数据,是一种“特殊”的线性存储结构。

特点:

•先进先出:队列中元素的添加(入队enqueue)和移除(出队dequeue)遵循先进先出的原
则。
•端点:队列有两个主要的端点——队头(front)和队尾(rear)。队头是队列中最先入队
的元素所在的位置,而队尾则是最后入队的元素所在的位置。

强调:队列不要混淆,栈是一端开口、另一端封口,元素入栈和出栈遵循“先进后出”原则;队列是两端都开口,但元素只能从一端进,从另一端出,且进出队列遵循“先进先出”的原则。

        实现方法:

        1.顺序表实现

        2.链表实现

以链表的方式为例子

二.链表实现队列

        队列的API设计

队列初始化

       

class Queue <T>
{//结点类class Node{public T data;//存储数据public Node next;//下一个结点public Node(T data , Node next){this.data = data;this.next = next;}}//创建首结点private Node head;//尾结点private Node last;//队列个数private int N;public Queue(){this.head =new Node(null,null);this.last =null;this.N =0;}

判断队列是否为空

思路分析:用布尔类型,直接返回数量

 //判断队列是否为空public boolean isEmpty(){return N == 0;}

获取队列个数

思路分析:直接返回数量

//返回队列元素个数public int size(){return N;}

插入元素

思路分析:

1.如果队列为空,将头结点指向新结点

2.创建变量1代替原先尾结点的数据

3.创建一个变量2当尾结点

4.将变量1的next引用指向变量2的值

 //插入元素public void enqueue(T data){//保存当前的尾结点Node oldLast = last;//创建新结点为新的尾结点last = new Node(data, null);//判断队列是否为空if(isEmpty()){head.next = last;}else{//将原先尾结点的next指向新结点oldLast.next = last;}N++;}

元素取出

思路分析:根据先进先出原则,我们需要更新头结点的next所指向的值

 //从队列拿出一个元素public T dequeue(){//为空,返回nullif(isEmpty()){return null;}//保存当前首结点Node oldFirst = head.next;//将首结点更新到下一个结点head.next = oldFirst.next;N--;//如果队列被删除完了,重置Last为nullif(isEmpty()){last = null;}return oldFirst.data;//返回取出元素}

三.用栈来实现队列

思路分析:

栈是后进先出(LIFO)的数据结构,队列是先进先出(FIFO)的数据结构。我们可以使用两个栈,一个用于入队操作(记为 inStack ),一个用于出队等操作(记为 outStack )。 

当执行 push 操作时,直接将元素压入 inStack 。因为 inStack 只负责接收新元素,就像队列的尾部接收新元素一样。 

当执行 pop 和 peek 操作时,需要先判断 outStack 是否为空。如果 outStack 为空,就将 inStack 中的所有元素依次弹出并压入 outStack ,此时 outStack 栈顶元素就是队列的开头元素(因为 inStack 中先进入的元素会在转移到 outStack 后处于栈顶)。然后再执行相应的 pop 或 peek 操作。 

执行 empty 操作时,只需判断 inStack 和 outStack 是否都为空。  

完整代码

import java.util.Stack;class MyQueue {private Stack<Integer> inStack; // 用于入队操作的栈private Stack<Integer> outStack; // 用于出队等操作的栈public MyQueue() {inStack = new Stack<>(); // 初始化入队栈outStack = new Stack<>(); // 初始化出队栈}public void push(int x) {inStack.push(x); // 将元素x压入入队栈,模拟队列的入队操作}public int pop() {if (outStack.isEmpty()) { // 如果出队栈为空while (!inStack.isEmpty()) { // 当入队栈不为空时outStack.push(inStack.pop()); // 将入队栈的元素依次弹出并压入出队栈}}return outStack.pop(); // 弹出并返回出队栈的栈顶元素,即队列开头的元素}public int peek() {if (outStack.isEmpty()) { // 如果出队栈为空while (!inStack.isEmpty()) { // 当入队栈不为空时outStack.push(inStack.pop()); // 将入队栈的元素依次弹出并压入出队栈}}return outStack.peek(); // 返回出队栈的栈顶元素,即队列开头的元素(不弹出)}public boolean empty() {return inStack.isEmpty() && outStack.isEmpty(); // 判断入队栈和出队栈是否都为空,都为空则队列空}
}
public class StudentMS4
{public static void main(String[] args){MyQueue myQueue = new MyQueue();//调用pushmyQueue.push(1);myQueue.push(2);//调用peekSystem.out.println("队列开头的元素是:"+myQueue.peek());//调用popSystem.out.println("移除并返回队列开头的元素:"+myQueue.pop());//调用empty方法System.out.println("队列是否为空:"+myQueue.empty());}
}

目录

一.基本概念

特点:

        实现方法:

二.链表实现队列

        队列的API设计

队列初始化

判断队列是否为空

获取队列个数

插入元素

元素取出

三.用栈来实现队列

思路分析:

完整代码



文章转载自:

http://qnITTdMb.pxbrg.cn
http://LCWZ9CSx.pxbrg.cn
http://PzioJTpb.pxbrg.cn
http://lx9dQ9Oo.pxbrg.cn
http://UQSefyG1.pxbrg.cn
http://b7onoP8Q.pxbrg.cn
http://nWGQgLkx.pxbrg.cn
http://FptcRXqF.pxbrg.cn
http://4ls6t9XQ.pxbrg.cn
http://kxsEthoP.pxbrg.cn
http://BMa0LXvF.pxbrg.cn
http://NNArkDKX.pxbrg.cn
http://kie5M7fM.pxbrg.cn
http://ETQE9kx8.pxbrg.cn
http://erz2qAcQ.pxbrg.cn
http://pwnsn4Y9.pxbrg.cn
http://iYvuZ5zD.pxbrg.cn
http://IMCUYVvj.pxbrg.cn
http://rpY2JKSt.pxbrg.cn
http://yxA0uwkN.pxbrg.cn
http://wcePbz78.pxbrg.cn
http://uMVSTWJ5.pxbrg.cn
http://wQZ7unLJ.pxbrg.cn
http://ejn6caku.pxbrg.cn
http://dqReCOpy.pxbrg.cn
http://WyU8obnM.pxbrg.cn
http://tKBv0aOD.pxbrg.cn
http://Ok2aRCPg.pxbrg.cn
http://ieoufowx.pxbrg.cn
http://oQNydd7a.pxbrg.cn
http://www.dtcms.com/a/371114.html

相关文章:

  • Dify 从入门到精通(第 79/100 篇):Dify 的多模态模型评估(高级篇)
  • 具身导航“所想即所见”!VISTA:基于生成式视觉想象的视觉语言导航
  • synchronized 锁升级
  • 深入解析 Java 的类加载机制
  • GEE:时间序列合成一个不填补空洞,保留时间序列空像素的新影像
  • Zoom AI 技术架构研究:联合式方法与多模态集成
  • Arch Linux运维自动更新脚本推荐
  • 深度拆解OpenHarmony NFC服务:从开关到卡模拟掌握近场通信技术
  • 第5章递归:分治法
  • 【Python字符串格式化】:全面指南与最佳实践
  • MySQL学习记录-索引
  • C++进阶——继承(2)
  • Oracle体系结构-Redo Log Buffer详解
  • 【医学影像 AI】YoloCurvSeg:仅需标注一个带噪骨架即可实现血管状曲线结构分割
  • Nginx安装及版本迭代热部署详解
  • [光学原理与应用-422]:非线性光学 - 计算机中的线性与非线性运算
  • 图片木马制作的三种方法
  • QT之实现点击按钮启动另一个桌面应用程序
  • 贪心算法在医疗影像分割中的应用详解
  • 责任分配矩阵(RAM)
  • Science Advances副主编:如何提高论文投稿接收率?
  • 【目录-单选】鸿蒙HarmonyOS开发者基础
  • C++语法之--多态
  • Spring Cloud Alibaba快速入门02-Nacos
  • 一阶低通滤波:从原理到实践,平滑数据的艺术
  • 2025最新超详细FreeRTOS入门教程:第一章 FreeRTOS移植到STM32
  • 用Python打造逼真的照片桌面:从拖拽到交互的完整实现
  • 【selenium】网页元素找不到?从$(‘[placeholder=“手机号“]‘)说起
  • 深入解析达梦数据库核心技术:检查点、redo、undo、MVCC与内存缓存刷盘
  • 四款主流深度相机在Python/C#开发中的典型案例及技术实现方案