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

【java数据结构】栈

【java数据结构】栈

  • 一、栈的概念
  • 二、 栈的使用
  • 三、 栈的模拟实现(数组)
        • 构造方法
        • size()
        • empty()
        • push()
        • pop()
        • peek()
  • 四、 栈的模拟实现(链表)
        • 构造方法
        • size()
        • empty()
        • push()
        • pop()
        • peek()
  • 五、 栈的例题

此篇博客希望对你有所帮助(帮助你了解栈),不懂的或有错误的也可在评论区留言,错误必改评论必回!!!持续关注,下一篇博客是java数集合框架中的队列!!!整篇博客的代码都在Gitee中(代码链接放下文章结尾)。

一、栈的概念

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

压栈:栈的插入操作叫做进栈\压栈\入栈。入栈数据在栈顶
在这里插入图片描述

出栈:栈的删除操作叫做出栈。出栈数据在栈顶
在这里插入图片描述

二、 栈的使用

在这里插入图片描述
从上图可以看到,Stack继承了Vector,Vector和ArrayList类似,都是动态的顺序表。不同的是Vector是线程安全的。
在这里插入图片描述
在这里插入图片描述

三、 栈的模拟实现(数组)

栈是一个特殊的顺序表,所以采用链表和数组的方式都可实现,但是,一般采用数组的方式实现.

    public MyStack(){}public int push(int e){}public int pop(){}public int peek(){}public int size(){}public boolean empty(){}
构造方法
public class MyStack {int[] array;int size;public MyStack() {array = new int[5];//默认栈容量为5}
} 
size()

获取栈中元素个数

    public int size(){return size;}
empty()

判断栈中元素个数是否为空

    public boolean empty(){return size==0;}
push()

首先先判断栈是否为满,如果满则进行扩容,返回要入栈的val值

    public int push(int val){if(size== array.length){array= Arrays.copyOf(array,2*array.length);}array[size]=val;size++;return val;}
pop()

先判断栈是否为空,为空则抛出异常;不为空,则输出栈顶元素,并且移除栈顶元素(栈顶元素发生变化),size–;

自定义为空异常:

public class EmptyException extends RuntimeException{public EmptyException() {}public EmptyException(String message) {super(message);}
}
    public int pop(){if(empty()){throw new EmptyException();}else{int val = array[size-1];size--;return val;}}
peek()

peek()方法是输出栈顶元素,但不移除栈顶元素(栈顶元素不发生变化)。

    public int peek(){if(empty()){throw new EmptyException();}else{return array[size-1];}}

四、 栈的模拟实现(链表)

栈中元素的入栈和出栈的时间复杂度为O(1),因此用链表实现栈就需要考虑插入和输出元素的时间复杂度是否为O(1)。
双链表实现栈:不管头插,头输出和尾插,尾输出,都满足栈的要求,因为我们知道头节点和尾节点的位置。
单链表实现栈:单链表实现栈,我们只能用头插入和头输出,因为我们不知道尾节点的位置,我们只能通过遍历得到尾节点的位置,那么时间复杂度将不是O(1)而是O(n)。

这里我们给大家演示一下用单链表模拟实现栈!

    public int push(int e){}public int pop(){}public int peek(){}public int size(){}public boolean empty(){}
构造方法
    static class ListNode {public int val;public ListNode next;public ListNode(int val) {this.val = val;}}public ListNode head;
size()
    public int size() {ListNode cur = head;int size = 0;while (cur != null) {size++;cur = cur.next;}return size;}
empty()
    public boolean empty() {return head==null;}
push()
    public int push(int val) {ListNode cur=new ListNode(val);if(head==null){head=cur;}else{cur.next=head;head=cur;}return head.val;}
pop()

先判空,pop()方法需要删除栈顶元素(这里相当于是头节点),所以定义一个节点来标记头节点,然后将头节向后移动。

    public int pop() {if(head==null){throw new EmptyException();}ListNode cur=head;head=head.next;return cur.val;}
peek()

因为peek()方法不删除栈顶元素(这里相当于是头节点),所以这里不需要将头节点向后移动。

    public int peek() {if(head==null){throw new EmptyException();}return head.val;}

五、 栈的例题

有效的括号

给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。

有效字符串需满足:
1.左括号必须用相同类型的右括号闭合。
2.左括号必须以正确的顺序闭合。
3.每个右括号都有一个对应的相同类型的左括号。
在这里插入图片描述

    public boolean isValid(String str) {Stack<Character> stack = new Stack<>();for (int i = 0; i < str.length() ; i++) {char s = str.charAt(i);if (s == '(' || s == '[' || s == '{') {stack.push(s);} else {if (stack.isEmpty()) {return false;}char s2 = stack.peek();if (s == ')' && s2 == '('|| s == '}' && s2 == '{'|| s == ']' && s2 == '[') {stack.pop();} else {return false;}}}if(!stack.isEmpty()){return false;}return true;}

逆波兰表达式求值

给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。
请你计算该表达式。返回一个表示表达式值的整数。

注意:

1.有效的算符为 ‘+’、‘-’、‘*’ 和 ‘/’ 。
2.每个操作数(运算对象)都可以是一个整数或者另一个表达式。
3.两个整数之间的除法总是 向零截断 。
4.表达式中不含除零运算。
5.输入是一个根据逆波兰表示法表示的算术表达式。
6.答案及所有中间计算结果可以用 32 位 整数表示。
在这里插入图片描述

    public int evalRPN(String[] tokens) {Stack<Integer> stack=new Stack<>();for (int i=0;i<tokens.length;i++) {if(calculation(tokens[i])){int val1=stack.pop();int val2=stack.pop();switch(tokens[i]){case "+":stack.push(val2+val1);break;case "-":stack.push(val2-val1);break;case "*":stack.push(val2*val1);break;case "/":stack.push(val2/val1);break;}}else{stack.push(Integer.valueOf(tokens[i]));}}return stack.pop();}private boolean calculation(String s){if(s.equals("+")||s.equals("-")||s.equals("*")||s.equals("/")){return true;}return false;}

栈的压入、弹出序列

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。
在这里插入图片描述

    public static boolean IsPopOrder (int[] pushV, int[] popV) {// write code hereStack<Integer> stack=new Stack<>();int j=0;for(int i=0;i<pushV.length;i++){stack.push(pushV[i]);while(j< popV.length&&!stack.isEmpty()&&stack.peek()==popV[j]){stack.pop();j++;}}if(!stack.isEmpty()){return false;}return true;}

最小栈
在这里插入图片描述

public Stack<Integer> stack;public  Stack<Integer> minStack;public MinStack() {stack = new Stack<>();minStack = new Stack<>();}public void push(int val) {stack.push(val);if(minStack.empty()) {minStack.push(val);}else {int peekVal = minStack.peek();if(val <= peekVal) {minStack.push(val);}}}public void pop() {if(stack.empty()) {return;}int popVal = stack.pop();if(popVal == minStack.peek()) {minStack.pop();}}public int top() {if(stack.empty()) {return -1;}return stack.peek();}public int getMin() {if(minStack.empty()) {return -1;}return minStack.peek();}

此篇博客的全部代码!

相关文章:

【java数据结构】栈

【java数据结构】栈 一、栈的概念二、 栈的使用三、 栈的模拟实现(数组)构造方法size()empty()push()pop()peek() 四、 栈的模拟实现(链表)构造方法size()empty()push()pop()peek() 五、 栈的例题 此篇博客希望对你有所帮助&#xff08;帮助你了解栈&#xff09;&#xff0c;不…...

从头开始的可视化数据 matplotlib:初学者努力绘制数据图

从头开始学习使用 matplotlib 可视化数据&#xff0c;对于初学者来说&#xff0c;可能会有些挑战&#xff0c;但 matplotlib 的核心理念非常清晰&#xff1a;绘制图表需要了解如何设置图形、坐标轴以及如何用数据填充它们。我们可以通过一些简单的例子来逐步介绍基本步骤。 1. …...

vscode 远程linux服务器 连接git

vscode 远程linux服务器 连接git 1. git 下载2. git 配置1&#xff09;github 设置2&#xff09;与github建立连接linux端&#xff1a;创建密钥github端&#xff1a;创建ssh key 3. 使用1&#xff09;初始化repository2&#xff09;commit 输入本次提交信息&#xff0c;提交到本…...

不同jdk版本中的接口规范

Java Development Kit&#xff08;JDK&#xff09;的每个版本通常会对 Java 语言和类库进行改进&#xff0c;接口规范也在不断演进。Java 接口的演变是逐步从 “纯粹抽象的定义” 向 “具有行为的抽象定义” 演化的。 JDK 1.0 和 JDK 1.1JDK 1.2 到 JDK 1.6JDK 1.8&#xff08;…...

人工智能图像信号处理器(AI ISP)技术介绍

随着智能设备和数码成像技术的快速发展&#xff0c;图像质量的提升成为用户体验的关键因素之一。人工智能图像信号处理器&#xff08;AI Image Signal Processor&#xff0c;AI ISP&#xff09; 作为传统图像信号处理器&#xff08;ISP&#xff09;的升级版&#xff0c;通过集成…...

3D Slicer 教程三 ---- 坐标系

上篇提到3D Slicer 教程二 ---- 数据集-CSDN博客 3d slicer的坐标系与大多数医学影像软件使用LPS&#xff08;左、后、上&#xff09;坐标系统不太一样, 今天就仔细介绍一下坐标系的区别,复盘一下在影像处理中遇到的坐标问题(集中在坐标处理相关的,图像插值,图像处理, 定位线,翻…...

Video-LLaMA论文解读和项目部署教程

Video-LLaMA: An Instruction-tuned Audio-Visual Language Model for Video Understanding 相关工作 大型语言模型&#xff1a; 本文的工作基于这些LLM&#xff0c;并提供即插即用插件&#xff0c;使其能够理解视频中的视觉和听觉内容。 多模态大型语言模型&#xff1a; 现有…...

Elasticsearch设置 X-Pack认证,设置账号和密码

前言 以下Elasticsearch版本&#xff1a;7.9.3 ES自带的X-Pack密码验证&#xff1a; X-Pack是elasticsearch的一个扩展包&#xff0c;将安全&#xff0c;警告&#xff0c;监视&#xff0c;图形和报告功能捆绑在一个易于安装的软件包中&#xff0c;所以我们想要开启账号密码验证…...

机器学习——量子机器学习(Quantum Machine Learning)

机器学习——量子机器学习&#xff08;Quantum Machine Learning&#xff09; 量子机器学习&#xff08;Quantum Machine Learning&#xff09;——未来的智能计算量子机器学习的核心概念使用Qiskit进行量子机器学习——代码示例代码解析量子机器学习的应用结论 量子机器学习&a…...

Android Studio 的 Gradle 任务列表只显示测试任务

问题现象如下&#xff1a; 问题原因&#xff1a; 这是因为Android Studio 设置中勾选了屏蔽其他gradle任务的选项。 解决方法&#xff1a; File -> Settings -> Experimental 取消勾选Only include test tasks in the Gradle task list generated during Gradle Sync&…...

Keepalived:高可用性的守护神

Keepalived:高可用性的守护神 在现代企业IT系统中,高可用性是确保业务连续性和服务质量的关键要素。系统面对硬件故障、软件错误、人为失误或自然灾害时,依然能保持正常运行,这样的能力对于企业来说至关重要。为此,业界开发了一系列高可用性解决方案,其中Keepalived以其…...

Golang笔记_day08

Go面试题&#xff08;一&#xff09; 1、空切片 和 nil 切片 区别 空切片&#xff1a; 空切片是指长度和容量都为0的切片。它不包含任何元素&#xff0c;但仍然具有切片的容量属性。在Go语言中&#xff0c;可以使用内置的make函数创建一个空切片&#xff0c;例如&#xff1a;…...

如何在 React 中更新状态对象的某个值

在 React 中&#xff0c;我们经常需要更新组件的状态来反映 UI 的变化。如果状态是一个复杂的对象&#xff0c;比如一个包含多个筛选条件的对象&#xff0c;我们希望只更新其中的某个键&#xff0c;而不是整个状态对象。今天&#xff0c;我将向大家展示如何在更新状态时保留已有…...

edge浏览器:你的连接不是专用连接

最近在使用edge浏览器打开github时&#xff0c;发现打不开了&#xff0c;提升你的连接不是专用连接。试了很多种方法甚至重装了浏览器&#xff0c;都没有用。 直到看到了这篇文章&#xff0c;才得到解决&#xff1a; 10 个修复此站点在 Windows Edge 上的连接不安全的问题htt…...

PDF 软件如何帮助您编辑、转换和保护文件

如何找到最好的 PDF 编辑器。 无论您是在为您的企业寻找更高效的 PDF 解决方案&#xff0c;还是尝试组织和编辑主文档&#xff0c;PDF 编辑器都可以在一个地方提供您需要的所有工具。市面上有很多 PDF 编辑器 — 在决定哪个最适合您时&#xff0c;请考虑这些因素。 1. 确定您的…...

如何使用Java爬虫处理API接口返回的JSON数据?

处理API接口返回的JSON数据是Java爬虫开发中的一个常见任务。在Java中&#xff0c;有多个库可以帮助我们解析JSON数据&#xff0c;其中最流行的是Jackson和Gson。以下是使用这两个库处理JSON数据的基本步骤和示例代码。 使用Jackson处理JSON Jackson是一个功能强大的JSON处理…...

Ajax是什么?

Ajax是什么&#xff1f; Ajax是创建交互式网页应用的网页开发技术。简单来说就是网页在不加载的情况下&#xff0c;可以跟服务器交换数据&#xff0c;并更新页面的内容。 原理&#xff1a; 1. 创建xhr&#xff08;xmlHttpRequest&#xff09;对象; 2, 通过xhr对象的open()方法和…...

技术方向简介

掌握 Java基础&#xff0c;包括OOP思想、集合、常用的设计模式&#xff1b;熟悉基本的数据结构和算法; 掌握JVM虚拟机和Java多线程并发编程&#xff0c;熟悉线程池、线程安全机制、锁的使用; 熟悉MySQL、Oracle等关系型数据库锁、事务、索引相关知识&#xff0c;了解DDL原理&…...

延迟队列实现及其原理详解

1.绪论 本文主要讲解常见的几种延迟队列的实现方式&#xff0c;以及其原理。 2.延迟队列的使用场景 延迟队列主要用于解决每个被调度的任务开始执行的时间不一致的场景&#xff0c;主要包含如下场景: 1.比如订单超过15分钟后&#xff0c;关闭未关闭的订单。 2.比如用户可以…...

web APIs

目录 Web APIs第一天Dom获取&属性操作Web API基本认知变量声明作用和分类什么是DOMDOM树DOM对象 获取Dom对象根据CSS选择器来获取DOM元素&#xff08;重点&#xff09;其他获取DOM元素方法&#xff08;了解&#xff09; 操作元素内容对象.innerText 属性对象.innerHTML 属性…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...