数据结构(Java):力扣Stack集合OJ题

1、括号匹配问题

. - 力扣(LeetCode)

1.1 思路分析

根据栈的先进后出原则,我们可以这样解决问题:

遍历字符串,遇见左括号就将左括号push入栈;遇见右括号就pop出栈,将出栈的元素和该右括号比较是否匹配,若匹配则继续遍历并比较,若不匹配则直接返回false。细分为以下几种情况:

1.匹配(左右括号数量相同且匹配):字符串遍历完,且栈为空(右括号与左括号数量相等,且均匹配),则说明括号匹配,返回true。

2.不匹配(括号不匹配):遍历到的右括号和出栈的左括号比较是否匹配,一旦不匹配,立即返回false。

3.不匹配(左括号数量多):当字符串遍历完后,发现栈还不为空,则说明左括号多,不匹配。

4.不匹配(右括号多):遍历遇见右括号需将栈顶的左括号出栈,若要出栈时栈为空,则说明右括号多,不匹配。

1.2 代码

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 {//遍历到的为右括号 进入else//若栈为空 则说明右括号多 立即返回falseif(stack.isEmpty()) {return false;}//若栈不为空 则pop出栈 比较是否匹配 char ch2 = stack.pop();switch(ch) {//使用switch语句比较是否匹配 一旦不匹配 立即返回falsecase ')':if(ch2 != '(') {return false;}break;case ']':if(ch2 != '[') {return false;}break;case '}':if(ch2 != '{') {return false;}break;}}}//遍历完成且栈为空 则说明匹配 if(!stack.isEmpty()) {return false;}return true;}

2、栈的弹出、压入序列

2.1 思路分析

以i遍历pushV,每次都将将i下标的元素入栈,再将栈顶元素和j下标元素比较,
若相等:则出栈,j++,i++
不相等:则i++,j保持原位

注意:j++后,j下标与栈顶元素可能依然相等,此时要连续出栈。即j变化后,要继续和栈顶元素比较。

  • i遍历完成,且j也遍历也完成(此时栈肯定为空),说明出栈序列匹配
  • 若i遍历完成后,j还没有遍历完成(栈不为空),则说明出栈序列不匹配
    因为只有栈顶元素和j下标元素相等时,才会出栈,j++

 2.2 代码

public boolean IsPopOrder (int[] pushV, int[] popV) {Stack<Integer> stack = new Stack<>();int j = 0;for (int i = 0; i < pushV.length; i++) {//每次循环都会将pushV中i下标的元素入栈stack.push(pushV[i]);//因为j++后,元素可能连续出栈,所以要while循环//出栈后,栈可能出现空的情况,!stack.isEmpty(),防止出现空指针异常while (!stack.isEmpty() && stack.peek() == popV[j]) {j++;//若j下标和栈顶元素相同,则出栈stack.pop();}}//i遍历完成,若此时j也遍历完成(j == popV.length),则说明出栈序列匹配return j == popV.length;}

3、逆波兰表达式(后缀表达式)求值

. - 力扣(LeetCode)

3.1 逆波兰表达式的定义

逆波兰表达式,也称为后缀表达式,是一种表达式的表示方法,其中运算符位于操作数之后。

后缀表达式由中缀表达式转化而来,可以实现表达式的求值和计算,提高了计算机内存访问的效率。而中缀表达式就是我们平时做运算的表达式。

那么如何将中缀表达式转换为后缀表达式?

  1. 从左向右,以先乘除后加减的次序加括号
  2. 将括号中的相邻两项的运算符拿到括号的后面
  3. 去掉所有括号

 3.2 后缀表达式如何求值(思路分析)

我们拿到后缀表达式后,

  1. 遍历表达式,若是非操作符元素(数字元素),则入栈
  2. 若遇到操作符元素,则出栈两次,将第一次出栈的元素val2作为该操作符的右操作数,将第二次出栈的元素val1作为该操作符的左操作数,接着将所得结果入栈。
  3. 继续遍历,并重复以上操作
  4. 遍历完成后,栈中只剩一个元素,该元素就是后缀表达式的值。

 3.3 代码

class Solution {public int evalRPN(String[] tokens) {Stack<Integer> stack = new Stack<>();for (int i = 0; i < tokens.length; i++) {String str = tokens[i];if (!isOperator(str)) {//如果不是是操作符//则元素入栈int val = Integer.parseInt(str);//将字符串转化为整型stack.push(val);} else {//如果是操作符//则弹出栈顶两个元素//计算结果,并将结果入栈int val2 = stack.pop();int val1 = stack.pop();if (str.equals("+")) {stack.push(val1 + val2);}if (str.equals("-")) {stack.push(val1 - val2);}if (str.equals("*")) {stack.push(val1 * val2);}if (str.equals("/")) {stack.push(val1 / val2);}}}//遍历完成后,栈中还有一个元素//该元素就是后缀表达式的值return stack.pop();}//判断该元素是否为操作符private boolean isOperator(String str) {if (str.equals("+") || str.equals("-")|| str.equals("*") || str.equals("/")) {return true;}return false;}
}

4、最小栈

. - 力扣(LeetCode)

4.1 思路分析

题目要求我们在O(1)内找到栈中的最小值,

而在Java已有的一个栈中我们只能通过遍历找最小值,时间复杂度为为O(n) 。

所以,我们可以建立两个栈,一个栈dataStack用来存储元素,另一个栈minStack的栈顶存最小值。

  1. minStack栈顶存储最小值数据 每次dataStack添加新数据时,和minStack栈顶元素比较,若<= ,则push入栈(一定要 <= ,因为dataStack中可能有多个相同的最小值,保证pop一次后,minStack依然存储着最小值)
  2. 当minStack为空时,那么dataStack添加的元素(第一次入栈的元素)一定为最小值
  3. 当dataStack弹出元素时,我们需要判断这个元素是否为minStack的栈顶元素(最小值),若是,也需要弹出minStack的元素

也就是说, minStack的栈顶元素,就是dataStack的最小值。

4.2 代码

class MinStack {Stack<Integer> dataStack;//存储所有数据Stack<Integer> minStack;// 栈顶存储最小值数据 每次添加新数据时,和minStack栈顶元素比较,若<= ,则push进minStackpublic MinStack() {dataStack = new Stack<>();minStack = new Stack<>();}public void push(int val) {dataStack.push(val);if (minStack.isEmpty()) {// 当minStack为空时,直接push进minStackminStack.push(val);} else {// 一定要有else 否则,minStack空时,同一个元素会在minStack中push两次if (val <= minStack.peek()) {// 一定要 <= ,因为dataStack中可能有多个相同的最小值,保证pop一次,minStack依然存储着最小值minStack.push(val);}}}public void pop() {// 操作总是在 非空栈 上调用int val = dataStack.pop();// 当dataStack栈顶元素为最小值时,也要弹出minStack的栈顶元素if (val == minStack.peek()) {minStack.pop();}}public int top() {return dataStack.peek();}public int getMin() {// minStack的栈顶元素即为最小值return minStack.peek();}
}

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

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

相关文章

pyparsing开启调试

在要匹配的表达后添加set_debug

【密码学】实现消息认证或数字签名的几种方式

消息认证的目的是验证消息的完整性和确认消息的来源。数字签名的目的是不仅验证消息的完整性和来源&#xff0c;还提供了不可否认性。此外&#xff0c;数字签名还可以验证消息的创建时间&#xff0c;防止重放攻击。那么具体有哪些实现的方式呢&#xff1f; 一、仅提供消息认证…

文件内容查阅

cat concatenate files and print on the standard output Linux中一个最简单的且最常用的命令是cat命令。其功能是在终端设备上显示文件内容。 cat命令-n选项用于显示行号。 tac concatenate and print files in reverse tac命令的功能是用于反向显示文件内容&#xff0c;即…

计算机网络复习笔记【面向考纲整理】

计算机网络复习笔记 一、计算机网络体系结构&#xff08;一&#xff09;计算机网络的概念、分类、组成与功能1.计算机网络的概念、组成与功能1.1计算机网络的概念1.2计算机网络的组成1.3计算机网络的功能 2.计算机网络的分类3.计算机网络的标准化工作及相关知识 &#xff08;二…

MT6816磁编码IC在工控机器人中的应用

在现代工业自动化领域&#xff0c;高精度的位置检测和控制技术对于机器人系统的稳定运行至关重要。MT6816磁编码IC作为一款先进的磁传感器解决方案&#xff0c;以其卓越的性能和稳定性&#xff0c;在工控机器人中得到了广泛的应用。本文将详细探讨MT6816磁编码IC在工控机器人中…

azure学习在日本IT工作的重要性

在日本数字化转型的浪潮中,微软Azure已经成为众多企业的首选云平台。作为全球第二大云服务提供商,Azure在日本市场的重要性与日俱增。本文将探讨为什么学习Azure对日本IT专业人士至关重要,以及如何通过lalapodo云原生技术的培训课程,快速掌握这一关键技能。 Azure在日本的战略地…

【Django+Vue3 线上教育平台项目实战】构建高效线上教育平台之首页模块

文章目录 前言一、导航功能实现a.效果图&#xff1a;b.后端代码c.前端代码 二、轮播图功能实现a.效果图b.后端代码c.前端代码 三、标签栏功能实现a.效果图b.后端代码c.前端代码 四、侧边栏功能实现1.整体效果图2.侧边栏功能实现a.效果图b.后端代码c.前端代码 3.侧边栏展示分类及…

element UI时间组件两种使用方式

加油&#xff0c;新时代打工&#xff01; 组件官网&#xff1a;https://element.eleme.cn/#/zh-CN/component/date-picker 先上效果图&#xff0c;如下&#xff1a; 第一种实现方式 <div class"app-container"><el-formref"submitForm":model&q…

探索 Prompt 的世界:让你的 AI 更智能

探索 Prompt 的世界&#xff1a;让你的 AI 更智能 引言什么是 Prompt&#xff1f;Prompt 的重要性如何编写有效的 Prompt1. 清晰明确2. 包含关键细节3. 提供上下文 实践中的 Prompt 技巧1. 多次迭代2. 实验不同风格3. 结合实际应用 总结 引言 随着人工智能&#xff08;AI&…

数据恢复篇:适用于 Android 的恢复工具

正在摆弄 Android 设备。突然&#xff0c;您意外删除了一张或多张图片。不用担心&#xff0c;您总能找到一款价格实惠的照片恢复应用。这款先进的软件可帮助 Android 用户从硬盘、安全数字 (SD) 或存储卡以及数码相机中恢复已删除的图片。 Android 上文件被删除的主要原因 在获…

采用自动微分进行模型的训练

自动微分训练模型 简单代码实现&#xff1a; import torch import torch.nn as nn import torch.optim as optim# 定义一个简单的线性回归模型 class LinearRegression(nn.Module):def __init__(self):super(LinearRegression, self).__init__()self.linear nn.Linear(1, 1) …

【Linux】数据流重定向

数据流重定向&#xff08;redirect&#xff09;由字面上的意思来看&#xff0c;好像就是将【数据给它定向到其他地方去】的样子&#xff1f; 没错&#xff0c;数据流重定向就是将某个命令执行后应该要出现在屏幕上的数据&#xff0c;给它传输到其他的地方&#xff0c;例如文件或…

[图解]企业应用架构模式2024新译本讲解26-层超类型2

1 00:00:00,510 --> 00:00:03,030 这个时候&#xff0c;如果再次查找所有人员 2 00:00:03,040 --> 00:00:03,750 我们会发现 3 00:00:05,010 --> 00:00:06,370 这一次所有的对象 4 00:00:06,740 --> 00:00:08,690 都是来自标识映射的 5 00:00:10,540 --> 00…

2024辽宁省数学建模C题【改性生物碳对水中洛克沙胂和砷离子的吸附】原创论文分享

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了2024 年辽宁省大学数学建模竞赛C题改性生物碳对水中洛克沙胂和砷离子的吸附完整的成品论文。 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃…

【JavaScript】解决 JavaScript 语言报错:Uncaught SyntaxError: Unexpected identifier

文章目录 一、背景介绍常见场景 二、报错信息解析三、常见原因分析1. 缺少必要的标点符号2. 使用了不正确的标识符3. 关键词拼写错误4. 变量名与保留字冲突 四、解决方案与预防措施1. 检查和添加必要的标点符号2. 使用正确的标识符3. 检查关键词拼写4. 避免使用保留字作为变量名…

全栈 Discord 克隆:Next.js 13、React、Socket.io、Prisma、Tailwind、MySQL笔记(一)

前言 阅读本文你需要有 Next.js 基础 React 基础 Prisma 基础 tailwind 基础 MySql基础 准备工作 打开网站 https://ui.shadcn.com/docs 这不是一个组件库。它是可重用组件的集合&#xff0c;您可以将其复制并粘贴到应用中。 打开installation 选择Next.js 也就是此页面…

智慧校园服务监控功能

智慧校园系统中的服务监控功能&#xff0c;扮演着维护整个校园数字化生态系统稳定与高效运作的重要角色。它如同一位全天候的守护者&#xff0c;通过实时跟踪、分析并响应系统各层面的运行状况&#xff0c;确保教学、管理等核心业务流程的顺畅进行。 服务监控功能覆盖了智慧校园…

开发个人Ollama-Chat--6 OpenUI

开发个人Ollama-Chat–6 OpenUI Open-webui Open WebUI 是一种可扩展、功能丰富且用户友好的自托管 WebUI&#xff0c;旨在完全离线运行。它支持各种 LLM 运行器&#xff0c;包括 Ollama 和 OpenAI 兼容的 API。 功能 由于总所周知的原由&#xff0c;OpenAI 的接口需要密钥才…

知识图谱与 LLM:微调与检索增强生成

Midjourney 的知识图谱聊天机器人的想法。 大型语言模型 (LLM) 的第一波炒作来自 ChatGPT 和类似的基于网络的聊天机器人&#xff0c;这些模型在理解和生成文本方面非常出色&#xff0c;这让人们&#xff08;包括我自己&#xff09;感到震惊。 我们中的许多人登录并测试了它写…

微信视频号的视频怎么下载到本地?快速教你下载视频号视频

天来说说市面上常见的微信视频号视频下载工具&#xff0c;教大家快速下载视频号视频&#xff01; 方法一&#xff1a;缓存方法 该方法来源早期视频技术&#xff0c;因早期无法将大量视频通过网络存储&#xff0c;故而会有缓存视频文件到手机&#xff0c;其目的为了提高用户体验…