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://www.mzph.cn/web/46393.shtml

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

相关文章

Vue--Router(路由)

目录 一 Router(路由) 1.作用 2.实现步骤 3.注意 一 Router(路由) 1.作用 Router又叫做路由&#xff0c;简单来说&#xff0c;就是用来实现vue的页面之间跳转的。 我们都知道&#xff0c;使用vue必然会涉及到很多个组件&#xff0c;也就是页面&#xff0c;而页面之间肯定需…

RK3588读取不到显示器edid

问题描述 3588HDMIout接老的显示器或者HDMI转DVI接DVI显示器显示不了或者显示内容是彩色条纹,但是这种显示器测试过如果接笔记本或者主机是可以直接显示的。这一类问题是HDMI下的i2c与显示器通讯没成功,读取不到设备的edid。问题包括全志的H3 、AML的S905都有遇到 测试环境…

Qt-事件与信号

事件和信号的区别在于&#xff0c;事件通常是由窗口系统或应用程序产生的&#xff0c;信号则是Qt定义或用户自定义的。Qt为界面组件定义的信号往往通常是对事件的封装&#xff0c;如QPushButton的clicked()信号可以看做对QEvent::MouseButtonRelease类事件的封装。 在使用界面组…

【QGroundControl二次开发】二.使用QT编译QGC(Windows)

【QGroundControl二次开发】一.开发环境准备&#xff08;Windows&#xff09; 二. 使用QT编译QGC&#xff08;Windows&#xff09; 2.1 打开QT Creator&#xff0c;选择打开项目&#xff0c;打开之前下载的QGC项目源码。 编译器选择Desktop Qt 6.6.3 MSVC2019 64bit。 点击运…

vue3-tree-org实现带照片的组织架构图

官方文档&#xff1a;vue3-tree-org 显示照片需要注意的地方 使用步骤 下载 npm install vue3-tree-org --save 在main.js中引入 import "vue3-tree-org/lib/vue3-tree-org.css"; import vue3TreeOrg from vue3-tree-org;app.use(vue3TreeOrg) 实现代码 <tem…

level 6 day2 网络基础2

1.socket&#xff08;三种套接字&#xff1a;认真看&#xff09; 套接字就是在这个应用空间和内核空间的一个接口&#xff0c;如下图 原始套接字可以从应用层直接访问到网络层&#xff0c;跳过了传输层&#xff0c;比如在ubtan里面直接ping 一个ip地址,他没有经过TCP或者UDP的数…

解决TypeError: __init__() takes 1 positional argument but 2 were given

问题描述&#xff1a; 如下图&#xff0c;在使用torch.nn.Sigmoid非线性激活时报错 源代码&#xff1a; class testrelu(nn.Module):def __init__(self):super().__init__()self.sigmoid Sigmoid()def forward(self, input):output self.sigmoid(input)return outputwriter…

Blackbox AI:你的智能编程伙伴

目录 Blackbox AI 产品介绍 Blackbox AI 产品使用教程 Blackbox AI体验 AI问答 代码验证 实时搜索 探索&代理 拓展集成 总结 Blackbox AI 产品介绍 Blackbox是专门为程序员量身定制的语言大模型&#xff0c;它针对20多种编程语言进行了特别训练和深度优化&#xff0c;在AI代…

React 从入门到实战 一一开发环境基础搭建(小白篇)

React 从入门到实战一一开发环境基础搭建&#xff08;小白篇&#xff09; React 介绍什么是 react &#xff1f;react 主要功能react 框架特点 开发工具渲染测试 React 介绍 最近两年&#xff0c;react 也愈来愈火热&#xff0c;想要在里面分一杯羹&#xff0c;那肯定逃不过 r…

Windows下使用Cygwin创建rsync服务端

1 下载Cygwin 访问官网Cygwin&#xff0c;点击setup-X86_64.exe即可开始下载 2 安装 前面全部默认。路径可以自己选择&#xff0c;站点选阿里云的&#xff0c;等待安装即可 3 配置 使用打开Cygwin安装后创建的快捷方式窗口&#xff0c;输入下面的指令将windows用户导入到cyg…

C语言中常见库函数(1)——字符函数和字符串函数

文章目录 前言1.字符分类函数2.字符转换函数3.strlen的使用和模拟实现4.strcpy的使用和模拟实现5.strcat的使用和模拟实现6.strncmp的使用和模拟实现7.strncpy函数的使用8.strncat函数的使用9.strncmp函数的使用10.strstr的使用和模拟实现11.strtok函数的使用12.strerror函数的…

物联网平台有哪些?

随着科技的不断进步&#xff0c;物联网&#xff08;IoT&#xff09;已经成为我们生活中不可或缺的一部分。物联网平台作为连接设备、数据和应用的桥梁&#xff0c;扮演着至关重要的角色。本文将介绍一些主流的物联网平台&#xff0c;并特别关注ThingsKit物联网平台。 物联网平…

UE4-系统默认天空球的使用

当我们在调整平行光的时候&#xff0c;会发现场景中的光照改变了&#xff0c;但是太阳的位置并没有改变&#xff0c;此时就需要用到系统默认的天空球中的&#xff1a; 但是只有在选中是由平行光的改变而改变的情况下才会发生改变&#xff0c;如果没有选择或者选择其他的光源&am…

couldn‘t read native报错!Typora中使用Pandoc导出Word失败的解决方法

couldn‘t read native报错&#xff01;Typora中使用Pandoc导出Word失败的解决方法 一、问题描述 在Typora中使用Pandoc将markdown文件导出为word文件时&#xff0c;发生如下图所示错误: 在网上找了资料以后&#xff0c;发现是因为md文件里面有表格&#xff0c;如果把表格删掉…

学生管理系统(C语言)(Easy-x)

课 程 报 告 课 程 名 称&#xff1a; 程序设计实践 专 业 班 级 &#xff1a; XXXXX XXXXX 学 生 姓 名 &#xff1a; XXX 学 号 &#xff1a; 231040700302 任 课 教 师 &a…

Rust Result 与可恢复的错误

Result 与可恢复的错误 大部分错误并没有严重到需要程序完全停止执行。有时&#xff0c;一个函数会因为一个容易理解并做出反应的原因失败。例如&#xff0c;如果因为打开一个并不存在的文件而失败&#xff0c;此时我们可能想要创建这个文件&#xff0c;而不是终止进程。 回忆…

RT-DETR+Flask实现目标检测推理案例

今天&#xff0c;带大家利用RT-DETR&#xff08;我们可以换成任意一个模型&#xff09;Flask来实现一个目标检测平台小案例&#xff0c;其实现效果如下&#xff1a; 目标检测案例 这个案例很简单&#xff0c;就是让我们上传一张图像&#xff0c;随后选择一下置信度&#xff0c;…

GPT LangChain experimental agent - allow dangerous code

题意&#xff1a;GPT LangChain 实验性代理 - 允许危险代码 问题背景&#xff1a; Im creating a chatbot in VS Code where it will receive csv file through a prompt on Streamlit interface. However from the moment that file is loaded, it is showing a message with…

激活pytorch遇到报错usage: conda-script.py [-h] [--no-plugins] [-V] COMMAND ...

问题 今天初次尝试在pycharm上创建与激活虚拟环境&#xff0c;创建结束后&#xff0c;使用命令conda activate pytorch激活虚拟环境时出现以下报错&#xff1a; usage: conda-script.py [-h] [–no-plugins] [-V] COMMAND … conda-script.py: error: argument COMMAND: inval…

Selenium原理深度解析

在自动化测试领域&#xff0c;Selenium无疑是最受欢迎和广泛使用的工具之一。它支持多种浏览器和操作系统&#xff0c;为开发人员和测试人员提供了强大的自动化测试解决方案。本文将深入探讨Selenium的工作原理&#xff0c;包括其架构、核心组件、执行流程以及它在自动化测试中…