Java学习苦旅(十七)——栈和队列

news2024/11/25 7:44:55

本篇博客将详细讲解Java中的栈和队列。

文章目录

    • 概念
    • Java中Stack常用方法
    • 代码实现
  • 队列
    • 概念
    • 队列常用方法对比
      • Queue
      • Deque
    • 代码实现Queue
  • 结尾

概念

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶

出栈:栈的删除操作叫做出栈,出数据在栈顶

image-20220301134330322

Java中Stack常用方法

方法解释
E push(E item)压栈
E pop()出栈
E peek()查看栈顶元素
boolean empty()判断栈是否为空

代码实现

使用顺序表实现push(),pop(),peek()

import java.util.*;

public class MyStack {
    public int[] elem;
    public int usedSize;

    public MyStack() {
        this.elem = new int[5];
    }

    public void push(int val) {
        if(isFUll()) {
            this.elem = Arrays.copyOf(this.elem,2*this.elem.length);
        }
        this.elem[this.usedSize] = val;
        this.usedSize++;
    }

    public boolean isFUll() {
        return this.usedSize == this.elem.length;
    }

    public int pop() {
        if (isEmpty()) {
            throw new RuntimeException("栈为空");
        }
        int oldVal = this.elem[usedSize-1];
        this.usedSize--;
        return oldVal;
    }

    public boolean isEmpty() {
        return this.usedSize == 0;
    }

    public int peek() {
        if (isEmpty()) {
            throw new RuntimeException("栈为空");
        }
        return this.elem[usedSize-1];
    }
}

队列

概念

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out)。

入队列:进行插入操作的一端称为队尾。

出队列:进行删除操作的一端称为队头。

image-20220301155409751

队列常用方法对比

Queue

错误处理抛储异常返回特殊值
入队列add(e)offer(e)
出队列remove()poll()
队首元素element()peek()

Deque

头部/尾部头部元素(队首)尾部元素(队尾)
错误处理抛出异常返回特殊值抛出异常返回特殊值
入队列addFirst(e)offerFirst(e)addLast(e)offerLast(e)
出队列removeFirst()pollFirst()removeLast()pollLast()
获取元素getFirst()peekFirst()getLast()peekLast()

代码实现Queue

class Node {
    public int val;
    public Node next;
    public Node(int val) {
        this.val = val;
    }
}

public class MyQueue {
    public Node head;
    public Node last;

    /**
     * 尾插法
     * @param val
     */
    public void offer(int val) {
        Node node = new Node(val);
        if (head == null) {
            head = node;
            last = node;
        } else {
            last.next = node;
            last = last.next;
        }
    }

    public int poll() {
        if (isEmpty()) {
            throw new RuntimeException("队列为空");
        }
        int oldVal = head.val;
        this.head = head.next;
        return oldVal;
    }

    public boolean isEmpty() {
        return this.head == null;
    }

    public int peek() {
        if (isEmpty()) {
            throw new RuntimeException("队列为空");
        }
        return head.val;
    }
}

结尾

本篇博客到此结束。
上一篇博客:Java学习苦旅(十六)——List
下一篇博客预告:Java学习苦旅(十八)——详解Java中的二叉树

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1350157.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Codeium在IDEA里的3个坑

转载自Codeium在IDEA里的3个坑:无法log in,downloading language server和中文乱码_downloading codeium language server...-CSDN博客文章浏览阅读1.7w次,点赞26次,收藏47次。Codeium安装IDEA插件的3个常见坑_downloading codeiu…

基于ssm鲜花销售管理系统

🍅点赞收藏关注 → 私信领取本源代码、数据库🍅 本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目希望你能有所收获,少走一些弯路。🍅关注我不迷路🍅项目介绍 随着科学技术的飞速发展…

【Linux常用指令】用户管理

文章目录 Linux系统目录结构Linux用户和用户组用户管理概述用户账号和用户组用户概念用户组概念 Linux用户和组的关系 Linux用户管理添加用户 useradd选项修改用户 usermod用户账号口令管理passwd删除用户 userdel Linux用户组管理添加新组groupadd修改群组groupmod删除群组gro…

2024史上最全的 iOS 各种测试工具集锦!

引言: 随着移动互联网的兴起,APP 测试的越来越被重视!Android 系统因为自己的开源性,测试工具和测试方法比较广为流传,但是 iOS 系统的私密性,导致很多测试的执行都有点麻烦。 为了帮助大家更好的执行 iO…

Sectigo和Certum的区别

为了保护用户在互联网的隐私,网站使用SSL数字证书为http明文传输协议加上安全套接层,对网站传输数据加密。Sectigo和Certum是正规的CA认证机构,它们颁发的SSL证书经过市场认证,已经兼容大多数浏览器以及终端,今天就随S…

【MATLAB】【数字信号处理】线性卷积和抽样定理

已知有限长序列:xk1,2,1,1,0,-3, hk[1,-1,1] , 计算离散卷积和ykxk*h(k) 。 程序如下: function [t,x] My_conv(x1,x2,t1,t2,dt) %文件名与函数名对应 %自写的卷积函数 x conv(x1,x2)*dt; t0 t1(1) t2(1); L length(x1) length(x2)-2; t t0:dt…

提取ROS bag文件中LiDAR点云数据为pcd格式

这段代码是用于从ROS bag文件中提取LiDAR点云数据并保存为PCD格式的。 1. 命令行 rosrun pcl_ros bag_to_pcd 2022-04-21-21-02-29.bag /rslidar_points_32 lidar_points_80_lines 详细解释如下: 1. rosrun pcl_ros bag_to_pcd 这是运行一个ROS节点bag_to_pcd,它来自pcl_r…

使用selenium定位csdn主页的收藏夹文章(含完整Python代码)

目录 前提:准备好流程 第一步 导包 代码 第三方库的下载流程 第二步 设置谷歌浏览器及要打开的网页 第三步 定位元素 代码 元素定位方法 前提:准备好流程 第一步 导包 这里需要提前下载好第三方库:selenium,time。代码及…

python多线程同步:Event对象

1.python事件Event相关函数介绍 set() — 全局内置标志Flag,将标志Flag 设置为 True,通知在等待状态(wait)的线程恢复运行 isSet() — 获取标志Flag当前状态,返回True 或者 False wait() — 一旦调用,线程将会处于阻塞状态,直到…

【Leetcode 80】删除排序数组中的重复项 II ——双指针

80. 删除排序数组中的重复项 II 给你一个有序数组nums,请你原地删除重复出现的元素,使得出现次数超过两次的元素只出现两次,返回删除后数组的新长度。 不要使用额外的数组空间,你必须在原地 修改输入数组并在使用 O(1) 额外空间…

VC++ ado 实现单表CURD

继续修改前文的资产管理源码; 新建一个数据库sds;把代码中的数据库连接改为连接此库; 新建下图一个表; 把之前的资产类别管理对话框改为下图所示;对话框ID也改为下图; 资产类别管理菜单和ID改为下图; 直接修改资产类别管理对话框类不太方便,新建一个对话框类,没有关联…

vue3基础知识一,安装及使用

一、安装vue3 需要安装node,然后在项目所在目录命令行执行以下代码。 npm create vuelatest 回车后需要配置以下内容。 二、安装所需的依赖包并运行 cd到项目目录,执行以下代码安装依赖包 npm i 运行项目 npm run dev 打开浏览器查看结果 ok&#…

携手罗振宇,泸州老窖用“眼前一亮”的方式开启全新700年

执笔 | 洪大大 编辑 | 萧 萧 又一段故事拉开帷幕,又一个品牌扣人心弦。 2023年12月31日跨年夜,由深圳卫视、得到APP联合出品的“时间的朋友”跨年演讲在深圳春茧体育馆正式开讲,现场,罗振宇用一段段睿智的话语与一个个鲜明的故…

系统架构设计面试指南(02)-MQ和文件存储

点击下方“JavaEdge”,选择“设为星标” 第一时间关注技术干货! 免责声明~ 任何文章不要过度深思! 万事万物都经不起审视,因为世上没有同样的成长环境,也没有同样的认知水平,更「没有适用于所有人的解决方案…

Go语言module,依赖管理方法

Go语言module,依赖管理方法 1.为什么需要依赖管理2.module管理配置流程打开go module配置一个国内的代理创建go.modGo Modules下的go get行为 3.GO env的其他配置GOSUMDBGONOPROXY/GONOSUMDB/GOPRIVATE 4.go.mod和go.sum概述5.Go Modules的语义化版本控制6.Go Modul…

Vue3-27-路由-路径参数的简单使用

什么是路径参数 在路由配置中,可以将【参数】放在【路由路径】中, 从而实现,同一个 路由,同一个组件,因路径参数不同,可以渲染出不同的内容。特点 : 1、当携带不同路径参数的路由相互跳转时&am…

Jupyter Notebook的10个常用扩展介绍

Jupyter Notebook(前身为IPython Notebook)是一种开源的交互式计算和数据可视化的工具,广泛用于数据科学、机器学习、科学研究和教育等领域。它提供了一个基于Web的界面,允许用户创建和共享文档,这些文档包含实时代码、…

关于解决引用第三方依赖突然失效的问题解决办法

目录 背景回顾解决办法结果 背景 出现该问题的背景是这样的。在项目中需要支持加载pdf文档的功能。所以采取了使用第三方PDF库的方法来实现加载pdf文档。集成完后,功能是正常的。后来过了一段时间,发现加载pdf的功能不能正常使用了,加载不出…

2023年的年度总结:不设边界、积极探索

23年的年度总结用一句话来说: 不设边界、积极探索 工作 从阿里来字节工作快3年了,这是一家年轻且充满活力的公司,伙食很棒,(跟刚毕业去网易那会伙食不相上下)。 作为一名应用层开发更多的时间都是和业务在…

Single-Image Crowd Counting via Multi-Column Convolutional Neural Network

Single-Image Crowd Counting via Multi-Column Convolutional Neural Network 论文背景人群密度方法过去的发展历史早期方法基于轨迹聚类的方法基于特征回归的方法基于图像的方法 Multi-column CNN用于人群计数基于密度图的人群计数通过几何自适应核生成密度图密度图估计的多列…