首页 > 编程语言 >恶补基础知识:Java 栈与队列详解

恶补基础知识:Java 栈与队列详解

时间:2024-08-15 10:52:26浏览次数:15  
标签:Java 恶补 offer 队列 元素 栈顶 基础知识 queue add

@

目录


前言

请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i


提示:以下是本篇文章正文内容,下面案例可供参考

简介

使用Java实现 栈(Stack)队列(Queue) 的操作是很常见的任务。栈和队列是两种不同的数据结构,它们分别具有特定的操作和行为。

栈是一种 后进先出(LIFO, Last In First Out) 的数据结构。它只允许在栈顶进行添加(push)或删除(pop)元素的操作。类似于羽毛球球桶一样最开始放进去的球需要最后拿出来

Java实现栈的示例代码:

public static void query() {
        Queue<Integer> queue = new LinkedList<>();
        // 入队
        queue.offer(1);
        queue.offer(2);
        queue.offer(3);

        // 查看队首元素
        System.out.println("队首元素: " + queue.peek()); // 不移除队首元素

        // 出队
        while (!queue.isEmpty()) {
            System.out.println("出队元素: " + queue.poll());
        }
    }


    public static void stack() {
        //1、创建栈:使用Stack类(尽管Stack是遗留类,更推荐使用Deque接口的实现如ArrayDeque)或Deque接口(及其实现类如ArrayDeque)来实现栈。
        //Stack<Integer> stack = new Stack<Integer>();
        Deque<Integer> stack = new ArrayDeque<>();

        //2、入栈将元素添加到栈顶
        stack.push(1);
        stack.push(2);
        stack.push(3);

        //3、出栈(Pop):从栈顶移除元素,并返回被移除的元素。Stack类提供了pop()方法用于出栈操作
        int element = stack.pop(); // 返回并移除栈顶元素
        System.out.println(element); // 输出:3


        // 4、访问栈顶元素(Peek):获取栈顶元素,但不对栈进行修改。Stack类提供了peek()方法用于访问栈顶元素
        int outElement = stack.peek(); // 返回栈顶元素但不移除
        System.out.println("栈顶元素: " + outElement); // 输出:3

        // 5、循环出栈
        while (!stack.isEmpty()) {
            System.out.println("出栈元素: " + stack.pop());
        }
        
        /*输出:
        栈顶元素: 3
        出栈元素: 3
        出栈元素: 2
        出栈元素: 1*/
    }

栈的主要应用场景包括:

  1. 函数调用栈:
    在编程语言中,函数调用是通过栈来实现的。当函数被调用时,它的局部变量、参数和返回地址等信息会被压入栈中。当函数执行完毕时,这些信息会从栈中弹出,控制权返回给调用者。

  2. 浏览器的前进后退:
    浏览器的历史记录通常使用栈来管理。当我们浏览网页时,每个访问的页面都会被压入栈中;当我们点击“后退”时,页面会从栈中弹出,返回到上一个页面。

  3. 括号匹配:
    在解析或编译代码时,检查圆括号、花括号等是否匹配是一个常见问题。栈可以用来解决这个问题,每当遇到一个左括号时,就将其压入栈中;每遇到一个右括号时,就检查栈顶元素是否与之匹配,如果匹配则弹出栈顶元素,否则报错。

  4. 撤销操作:
    在许多编辑器或图形界面中,用户可以通过撤销操作回到之前的状态。撤销操作通常使用栈来实现,每次操作都会被压入栈中,当用户执行撤销操作时,栈顶的操作会被弹出并应用于当前状态。

队列

队列是一种 先进先出(FIFO, First In First Out) 的数据结构。它只允许在队尾添加元素(enqueue)和在队首删除元素(dequeue)类似于排队的过程

Java实现队列的示例代码:

public static void queue() {
        // 1、创建队列:我们可以使用Java的集合类LinkedList来实现队列的操作。
        Queue<Integer> queue = new LinkedList<>();
        // 2、入队(Enqueue):将元素添加到队尾。LinkedList类提供了offer()方法用于入队操作。
        queue.offer(1);
        queue.offer(2);
        queue.offer(3);

        //3、出队(Dequeue):从队头移除元素,并返回被移除的元素。LinkedList类提供了poll()方法用于出队操作。
        int element = queue.poll(); // 返回并移除队头元素
        System.out.println(element); // 输出:1

        // 4、访问队头元素(Peek):获取队头元素,但不对队列进行修改。LinkedList类提供了peek()方法用于访问队头元素。
        System.out.println("队首元素: " + queue.peek()); // 不移除队首元素

        // 5、循环出队
        while (!queue.isEmpty()) {
            System.out.println("出队元素: " + queue.poll());
        }

        /*输出:
        队首元素: 1
        出队元素: 1
        出队元素: 2
        出队元素: 3*/
    }

LinkedList中的add方法和offer方法的区别

add方法:‌ add方法属于Collection接口,‌它试图将指定的元素添加到列表中。‌如果添加成功,‌它返回true;‌如果因为某些原因(‌如容量限制)‌添加失败,‌它会抛出IllegalStateException异常。‌在LinkedList中,‌当队列为空时,‌使用add方法可能会因为违反容量限制而报错。‌此外,‌当将LinkedList视为列表使用时,‌通常采用add方法来压入对象。‌

offer方法:‌ offer方法属于Deque接口(‌双端队列)‌,‌它试图将指定的元素插入到队列中。‌如果插入成功,‌它返回true;‌如果因为空间限制无法添加元素,‌则返回false。‌与add方法不同,‌offer方法不会抛出异常,‌而是通过返回值来指示操作是否成功。‌在有容量限制的队列中,‌offer方法优于add方法,‌因为它通过返回false来处理空间不足的情况,‌而不是抛出异常,‌这种方式更加高效。‌

总结来说,‌add方法和offer方法的主要区别在于它们的返回值和异常处理方式。‌add方法可能会因为违反容量限制而抛出异常,‌而offer方法则通过返回值来指示操作是否成功,‌避免了异常处理开销。‌

队列主要应用场景:

  1. 任务调度:
    在多任务处理系统中,任务通常被存储在一个队列中。系统按照任务进入队列的顺序来执行它们,实现了公平的调度。

  2. 消息传递:
    在进程间通信或网络编程中,消息通常被存储在一个队列中。发送者将消息发送到队列的尾部,接收者从队列的头部取出消息进行处理。

  3. 页面请求处理:
    在Web服务器中,多个用户请求可能同时到达。服务器可以将这些请求存储在一个队列中,然后按照请求到达的顺序进行处理。

  4. 广度优先搜索(BFS):
    在图的遍历算法中,广度优先搜索使用队列来存储待访问的节点。算法开始时,将起始节点加入队列。然后,算法循环进行,每次从队列中取出一个节点进行访问,并将其未被访问的邻接节点加入队列。

总结

了解栈和队列的应用场景有助于我们根据实际需求选择合适的数据结构,从而更高效地解决问题。


我是南国以南i记录点滴每天成长一点点,学习是永无止境的!转载请附原文链接!!!

标签:Java,恶补,offer,队列,元素,栈顶,基础知识,queue,add
From: https://www.cnblogs.com/bgyb/p/18360422

相关文章

  • Java计算机毕业设计的体育用品交易平台(开题+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着全球体育产业的蓬勃发展,体育爱好者对高品质、多样化的体育用品需求日益增长。然而,传统体育用品销售模式受限于地域、渠道及信息不对称等问题,难以......
  • Java计算机毕业设计的戏曲文化博物馆(开题+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在中华文化的浩瀚星空中,戏曲艺术犹如一颗璀璨的明珠,承载着千年的历史记忆与民族情感。从元代的杂剧到明清的传奇,再到近现代的地方戏曲,戏曲文化不仅丰......
  • Java计算机毕业设计的网上二手书销售系统(开题+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着数字化时代的到来,纸质书籍虽然面临着电子阅读的挑战,但其独特的阅读体验和收藏价值依然深受广大读者喜爱。然而,实体书店的运营成本上升与读者购书......
  • Java基础-学习笔记12
    12异常异常Java语言中,将程序执行中发生的不正常情况称为“异常”。(开发过程中的语法错误和逻辑错误不是异常)执行过程中所发生的异常时间可分为两大类1)Error(错误):Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。比如:StackOverflowError(栈溢出)和OOM(ou......
  • java使用动态链接库读取Fanuc设备,在linux环境部署时报错:FOCAS2 log file is not found
    在linux环境中,使用java调用动态链接库的方式读取Fanuc,报错“FOCAS2logfileisnotfound”解决办法linux环境使用cnc_allclibhndl3之前,需要先使用cnc_startupprocess启用并指定日志文件,否则会报错:"FOCAS2logfileisnotfound"。会包含cnc_startupprocess,windows的dll库......
  • 使用 JavaScript 进行线性搜索
    一.介绍线性搜索,也称为顺序搜索,是一种用于在列表中查找特定值的简单搜索算法。它的工作原理是逐个检查列表中的每个元素,直到找到所需的值或到达列表的末尾。以下是线性搜索如何工作的逐步描述。**从头开始:**从列表的第一个元素开始。**比较各个元素:**将当前元素与目标值......
  • Java 中的线程本地存储(ThreadLocal)机制介绍
    Java中的ThreadLocal是一个用于实现线程本地存储(ThreadLocalStorage,TLS)的机制。它可以为每个线程提供独立的变量副本,使得一个线程中的变量不受其他线程中的变量的影响。ThreadLocal通常用于在多线程环境下避免线程之间共享数据,从而实现线程安全。一、基本用法ThreadLoca......
  • Java数组篇[10]:数组的常见应用场景
    哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。  我是一名后端开发爱好者......
  • Java中的代理模式(个人学习笔记)
    什么是代理代理是一种设计模式,提供了对目标对象另外的访问方式。(用户不需要直接访问目标对象,只需要接触代理对象就能实现访问)代理的好处目标对象可以被间接访问可以在目标对象实现的基础上实现额外的功能(除了目标对象提供的方法外,代理可以额外提供一些实用的方法),即扩展......
  • 【LeetCode:3148】矩阵中的最大得分(Java)
    题目链接3148.矩阵中的最大得分题目描述给你一个由正整数组成、大小为mxn的矩阵grid。你可以从矩阵中的任一单元格移动到另一个位于正下方或正右侧的任意单元格(不必相邻)。从值为c1的单元格移动到值为c2的单元格的得分为c2-c1。你可以从任一单元格开始......