Java(二十一)---栈的使用和模拟实现

文章目录

  • 前言
  • 1.什么是栈(Stack)?
  • 2. 栈的模拟实现
  • 3.stack的使用![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/80c82d22f3ee49cfaa2915d1c961573e.png)
  • 4.关于栈的oj题
    • 4.1.有效的括号
    • 4.2.逆波兰表达式
    • 4.3.栈的压入、弹出序列
    • 4.4.最小栈


前言

前面几篇我们学习了顺序表以及链表的模拟使用,和一些oj题,下面我们学习两个比较特别的数据结构—栈和队列
由于篇幅的限制,这一次,我们先学习


1.什么是栈(Stack)?

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶
出栈:栈的删除操作叫做出栈。出数据在栈顶
在这里插入图片描述
栈在现实生活中的例子:
在这里插入图片描述

2. 栈的模拟实现

底层使用顺序表进行维护,以次实现下面功能。
在这里插入图片描述

public class MyStack {public int[] elem;public int useSize;public MyStack(){this.elem = new int[10];}public void push(int data){if (isFull()){this.elem = Arrays.copyOf(elem,2 * elem.length);}elem[useSize++] = data;}public boolean isFull(){return useSize == this.elem.length;}public int pop(){if (isEmpty()){throw new EmptyStackException();}int val = elem[useSize-1];useSize--;return val;}public int peek(){if (isEmpty()){throw new EmptyStackException();}return elem[useSize - 1];}public boolean isEmpty(){return useSize == 0;}
}

其主要逻辑跟顺序表的一模一样,可以先把之前顺序表的重新再看一遍,再过来看上述代码,就迎刃而解了。


3.stack的使用在这里插入图片描述

    public static void main(String[] args) {Stack<Integer> stack= new Stack();stack.push(1);stack.push(2);stack.push(3);stack.push(4);System.out.println(stack.size()); // 获取栈中有效元素个数---> 4System.out.println(stack.peek()); // 获取栈顶元素---> 4stack.pop(); // 4出栈,栈中剩余1 2 3,栈顶元素为3System.out.println(stack.pop()); // 3出栈,栈中剩余1 2 栈顶元素为3if(stack.empty()){System.out.println("栈空");}else{System.out.println(stack.size());}}

4.关于栈的oj题

4.1.有效的括号

在这里插入图片描述
在这里插入图片描述

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

4.2.逆波兰表达式

在这里插入图片描述
在这里插入图片描述
首先要学习什么是逆波兰表达式,又称为后缀表达式,而波兰表达式,称为中缀表达式。
中缀表达式:有利于人们阅读与表达。
后缀表达式,有利于机器进行运算。
咱们举一个中缀表达式转化为后缀表达式的一个例子。
中缀表达式:a + b * c + ( d * e + f ) * g
后缀表达式:abc* + de* f + g* +
怎么进行转化的?
在这里插入图片描述

然后后缀表达式转化为中缀表达式,并且把值算出来,就是用栈来实现。
在这里插入图片描述

class Solution {public int evalRPN(String[] tokens) {Stack<Integer> stack = new Stack();for (String str : tokens) {if (!operation(str)) {int x = Integer.parseInt(str);stack.push(x);} else {// 要注意 val1 和 val2 的位置int val2 = stack.pop();int val1 = stack.pop();switch (str) {case "+":stack.push(val1 + val2);break;case "-":stack.push(val1 - val2);break;case "*":stack.push(val1 * val2);break;case "/":stack.push(val1 / val2);break;}}}return stack.pop();}public boolean operation(String str) {if (str.equals("+") || str.equals("-")|| str.equals("*") || str.equals("/")) {return true;}return false;}
}

4.3.栈的压入、弹出序列

在这里插入图片描述
在这里插入图片描述

import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param pushV int整型一维数组 * @param popV int整型一维数组 * @return bool布尔型*/public boolean IsPopOrder (int[] pushV, int[] popV) {Stack<Integer> stack = new Stack();int i = 0;int j = 0;while(i < pushV.length){stack.push(pushV[i]);while(j < popV.length&&!stack.empty()&&stack.peek() == popV[j]){stack.pop();j++;}i++;}return stack.empty();}
}

4.4.最小栈

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

class MinStack {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.isEmpty()){minstack.push(val);}else{int peek = minstack.peek();if (val <= peek){minstack.push(val);}}}public void pop() {if (minstack.isEmpty()){return;}int popVal = stack.pop();if (popVal == minstack.peek()){minstack.pop();}}public int top() {if (stack.isEmpty()){return -1;}return stack.peek();}public int getMin() {if (minstack.isEmpty()){return -1;}return minstack.peek();}
}

下一篇我们学习队列的使用,我们不见不散!

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

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

相关文章

UE4-打包游戏,游戏模式,默认关卡

一.打包游戏 注意windows系统无法打包苹果系统的执行包&#xff0c;只能使用苹果系统打包。 打包完之后是一个.exe文件。 打包要点&#xff1a; 1.确定好要操控的角色和生成位置。 2.设置默认加载的关卡和游戏模式。 在这个界面可以配置游戏的默认地图和游戏的模式&#xff0c;…

八,九、 MyBatis 操作数据库 ★ ✔

八&#xff0c;九、 MyBatis 操作数据库 JDBC 操作⽰例回顾1. 什么是MyBatis?2. MyBatis⼊⻔2.1 准备⼯作2.1.1 创建⼯程 2.1.2 数据准备2.2 配置数据库连接字符串2.3 写持久层代码 ★2.4 单元测试 ★ 使⽤Idea ⾃动⽣成测试类3. MyBatis的基础操作3.1 打印⽇志 ★3.2 参数传递…

26.js事件

事件&#xff1a;用户行为 事件三要素: 事件源 事件类型 事件处理函数 事件绑定 语法1&#xff1a;dom 0级&#xff08;dom 0级指最原始的&#xff0c;在dom标准被正式定义之前的事件处理方式&#xff0c;事件处理函数通常在<script>标签中或直接在HTML元素的事件属性上…

轻量级文本编辑器 | Notepad-- v2.17 官方版

软件简介 Notepad--是一款国产的跨平台轻量级文本编辑器&#xff0c;旨在作为 Notepad 的替代品。它使用 C 编写&#xff0c;支持 Windows、Mac、Linux 等多种操作系统。 鉴于某些Notepad竞品作者的不当言论&#xff0c;Notepad--的意义在于&#xff1a;减少一点错误言论&…

应用最优化方法及MATLAB实现——第5章代码实现

一、概述 继上一章代码后&#xff0c;这篇主要是针对于第5章代码的实现。部分代码有更改&#xff0c;会在下面说明&#xff0c;程序运行结果跟书中不完全一样&#xff0c;因为部分参数&#xff0c;书中并没有给出其在运行时设置的值&#xff0c;所以我根据我自己的调试进行了设…

SwiftUI 6.0(Xcode 16)新 PreviewModifier 协议让预览调试如虎添翼

概览 用 SwiftUI 框架开发过应用的小伙伴们都知道&#xff0c;SwiftUI 中的视图由各种属性和绑定“扑朔迷离”的缠绕在一起&#xff0c;自成体系。 想要在 Xcode 预览中泰然处之的调试 SwiftUI 视图有时并不是件容易的事。其中&#xff0c;最让人秃头码农们头疼的恐怕就要数如…

httpx,一个网络请求的 Python 新宠儿

大家好&#xff01;我是爱摸鱼的小鸿&#xff0c;关注我&#xff0c;收看每期的编程干货。 一个简单的库&#xff0c;也许能够开启我们的智慧之门&#xff0c; 一个普通的方法&#xff0c;也许能在危急时刻挽救我们于水深火热&#xff0c; 一个新颖的思维方式&#xff0c;也许能…

SpringBoot框架学习笔记(三):Lombok 和 Spring Initailizr

1 Lombok 1.1 Lombok 介绍 &#xff08;1&#xff09;Lombok 作用 简化JavaBean开发&#xff0c;可以使用Lombok的注解让代码更加简洁Java项目中&#xff0c;很多没有技术含量又必须存在的代码&#xff1a;POJO的getter/setter/toString&#xff1b;异常处理&#xff1b;I/O…

【Python实战因果推断】41_合成控制1

目录 Online Marketing Dataset 在之前了解了面板数据在因果识别方面的优势。也就是说&#xff0c;你不仅可以比较单位之间的关系&#xff0c;还可以比较单位的前世今生&#xff0c;这样你就可以用更可信的假设来估计反事实 。您还了解了差分法&#xff08;DID&#xff09;及其…

python调用MATLAB出错matlab.engine.MatlabExecutionError无法调用MATLAB函数报错

python调用MATLAB出错matlab.engine.MatlabExecutionError无法调用MATLAB函数报错 说明(废话)解决方案MATLAB异常乱码python矩阵转MATLAB矩阵matlab.engine.MatlabExecutionError 说明(废话) python调用MATLAB&#xff0c;调用m文件中的函数&#xff0c;刚开始都没有问题&…

玄机-第一章 应急响应- Linux入侵排查

文章目录 前言简介应急开始准备工作步骤 1步骤 2步骤 3步骤 4步骤5 总结 前言 作者这一次也是差一点一次过&#xff0c;因为没有经验的原因&#xff0c;或者说题目对问题描述不太对&#xff0c;如果说是求黑客反连的ip的话我或许就知道要执行一下留下来的那个 .elf 可疑文件。 …

SpringCloud之Nacos集群,让Nacos不再是谜

Nacos集群搭建 集群结构 Nacos的集群环境我们采用这种结构&#xff1a;3个Nacos注册中心1个MySql Nacos集群 我们在windows上安装3个Nacos节点。分配配置相关信息 application.properties: 持久化数据到mysql中 修改 cluster.conf.example为cluster.conf然后在里面写上相关…

ARM体系结构和接口技术(六)KEY按键实验① 按键轮询检测

文章目录 一、按键轮询&#xff08;一&#xff09;分析按键的电路连接1. 按键原理图2. 按键消抖 二、分析芯片手册&#xff08;一&#xff09; GPIO章节&#xff08;二&#xff09;RCC章节 三、代码&#xff08;一&#xff09;key.c&#xff08;二&#xff09;key.h 一、按键轮…

lua 游戏架构 之 LoaderWallet 异步加载

定义了一个名为LoaderWallet class&#xff0c;用于管理资源加载器&#xff08;Loader&#xff09;。这个类封装了资源加载的功能&#xff0c;包括异步加载&#xff0c;以及资源的释放和状态查询。下面是对代码的详细解释&#xff1a; ### 类定义和初始化 这里定义了一个名为…

QT CNA上位机报错 解决方案

QT编译报错: -lControlCAN 解决方案 更换三个文件&#xff0c;即可解决(QT 自带的是32位库&#xff0c;应使用64位库文件)

【Vue】快速入门:构建你的第一个Vue 3应用

文章目录 一、Vue简介二、环境搭建1. 安装Node.js和npm2. 安装Vue CLI 三、创建Vue项目四、项目结构介绍五、组件基础创建一个组件使用组件 六、模板语法插值指令v-bindv-ifv-for 七、事件处理八、状态管理安装Vuex创建Store使用Store 九、路由基础安装Vue Router配置路由使用路…

PiT : 基于池化层Pooling layer的Vision Transformer

CNN的降维原理;随着深度的增加,传统CNN的通道维数增加,空间维数减少。经验表明,这样的空间降维对变压器结构也是有益的,并在原有的ViT模型的基础上提出了一种新的基于池的视觉变压器(PiT)。 1. 引言 ViT与卷积神经网络(CNN)有很大的不同。将输入图像分成1616小块馈送到变压…

力扣刷题之2959.关闭分部的可行集合数目

题干描述 一个公司在全国有 n 个分部&#xff0c;它们之间有的有道路连接。一开始&#xff0c;所有分部通过这些道路两两之间互相可以到达。 公司意识到在分部之间旅行花费了太多时间&#xff0c;所以它们决定关闭一些分部&#xff08;也可能不关闭任何分部&#xff09;&…

mysql group_concat()函数、行转列函数

文章目录 一、group_concat函数1.1、语法1.2、示例1.2.1、查询所有姓名&#xff0c;并显示在一行1.2.2、单列合并&#xff0c;指定冒号分隔符1.2.3、单列合并&#xff0c;去重1.2.4、多列拼接合并1.2.5、多列拼接合并&#xff0c;列和列之间指定分隔符 在mysql的关联查询或子查…

周报0708-0715(run代码)

本周围绕代码展开学习&#xff0c;学习了组内的FWI代码&#xff0c;主要收获是熟练了创建环境、匹配解释器、安装必要包的流程&#xff0c;以及搜索时的小Tips&#xff1a;比如需要的包whl&#xff08;表示该包的编译版本&#xff09;。遇到的问题仍然不少 三个主要问题&#…