数据结构(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;}
}

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

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

相关文章

最简单的vue3组件之间传值

localStorage 是 HTML5 引入的一个 Web Storage API 的一部分&#xff0c;它允许网页在用户的浏览器上存储数据。localStorage 提供了一种持久化的本地存储方案&#xff0c;数据不会因为浏览器关闭而丢失&#xff0c;除非用户或脚本显式地删除它们。 localStorage 是一种非常实…

批量提取网页表格内容至excel文件

问题背景 将网页的表格内容&#xff08;5237个股票信息&#xff09;复制粘贴到excel文件中 网址&#xff1a;A股上市公司名单-A股上市公司名录-A股上市公司大全-商业计划书-可研报告-中商产业研究院数据库-中商情报网 实现代码 # 导入包 import pandas as pd import time# 创…

超越传统:3D生物打印如何利用扩散创造奇迹?

超越传统&#xff1a;3D生物打印如何利用扩散创造奇迹&#xff1f; 组织工程和再生医学领域迫切需要能够模拟人体组织结构和功能的体外模型和组织替代物。然而&#xff0c;传统的体外模型和组织替代物往往难以满足高度特异性、复杂性和功能性的要求。3D生物打印技术应运而生&a…

Base64文件流查看下载PDF方法-CSDN

问题描述 数票通等接口返回的PDF类型发票是以Base64文件流的方式返回的&#xff0c;无法直接查看预览PDF发票&#xff0c; 处理方法 使用第三方在线工具&#xff1a;https://www.jyshare.com/front-end/61/ 在Html代码框中粘贴如下代码 <embed type"application/pd…

技术开发分享:商品详情APP原数据实时接口代码解析

商品详情app端原数据实时接口代码解析主要包括以下几个步骤&#xff1a; 获取商品ID&#xff1a;首先需要从淘宝的分享链接中提取商品ID&#xff0c;可以通过正则表达式匹配的方式获取。 构建请求URL&#xff1a;根据商品ID构建请求URL&#xff0c;通常包括淘宝的商品详情API地…

未来互联网的新篇章:深度解析Web3技术

随着技术的不断演进&#xff0c;Web3正逐渐成为引领未来互联网发展的关键驱动力。本文将深入探讨Web3技术的核心概念、关键特征以及其对未来互联网生态的深远影响&#xff0c;旨在帮助读者全面理解和把握这一新兴技术的发展方向和潜力。 1. Web3的基本概念和演进 Web3并非简单…

为什么键盘上F和J这两个键有两个凸起的横线呢?

不知道小伙伴们有没有注意过&#xff0c;我们常用的电脑键盘上&#xff0c;为什么F和J这两个键总是有两个凸起的横线的呢&#xff1f; 首先&#xff0c;让我们来回顾一下这位陪伴我们多年的老朋友——键盘。从最初的打字机到现在的机械键盘、薄膜键盘&#xff0c;键盘的形态和…

新书速览|Vue.js 3.x+Express全栈开发:从0到1打造商城项目

《Vue.js 3.xExpress全栈开发&#xff1a;从0到1打造商城项目》 1 本书内容 《Vue.js 3.xExpress全栈开发 : 从0到1打造商城项目》是一本详尽的全栈开发教程&#xff0c;旨在通过Vue.js和Express框架引导读者从零开始构建一个完整的电商项目。内容覆盖电商项目的基本结构&…

C++——map和set类用法指南

一、前言 1.1 关联式容器 关联式容器也是用来存储数据的&#xff0c;与序列式容器不同的是&#xff0c;其里面存储的是<key,value>结构的键值对&#xff0c;在数据检索时比序列式容器效率更高。 1.2 键值对 用来表示具有一一对应关系的一种结构&#xff0c;该结构中一般…

Redis如何高效实现定时任务

写在文章开头 redis通过单线程结合非阻塞事件轮询机制实现高效的网络IO和时间事件处理&#xff0c;这篇文章我们将从源码的角度深入分析一下redis时间事件的设计与实现。 Hi&#xff0c;我是 sharkChili &#xff0c;是个不断在硬核技术上作死的 java coder &#xff0c;是 CS…

项目三层架构详情

三层架构 三层架构就是为了符合“高内聚&#xff0c;低耦合”思想&#xff0c;把各个功能模块划分为表示层&#xff08;UI&#xff09;、业务逻辑层&#xff08;BLL&#xff09;和数据访问层&#xff08;DAL&#xff09;三层架构&#xff0c;各层之间采用接口相互访问&#xf…

(正向)代理 vs. 反向代理

&#xff08;正向&#xff09;代理 vs. 反向代理 代理和反向代理都是针对用户而言的。 一、&#xff08;正向&#xff09;代理——代理客户端 1. 流程 代理会隐藏客户端的真实信息&#xff08;IP、端口&#xff09;&#xff0c;代替客户端在互联网上发起请求&#xff0c;并将…

什么是RLHF(基于人类反馈的强化学习)?

什么是RLHF&#xff08;基于人类反馈的强化学习&#xff09;&#xff1f; 基于人类反馈的强化学习&#xff08;Reinforcement Learning from Human Feedback, RLHF&#xff09;是一种结合强化学习和人类反馈的技术&#xff0c;用于训练智能体&#xff0c;使其行为更符合人类期…

哪些类型的工作需要六西格玛绿带培训?

一、六西格玛绿带是什么&#xff1f; 首先&#xff0c;让我们来了解一下六西格玛绿带。六西格玛绿带是六西格玛管理体系中的一个重要角色&#xff0c;他们通常负责在项目中执行六西格玛方法和工具&#xff0c;协助黑带完成复杂的项目任务。绿带需要掌握基本的六西格玛知识和技…

萝卜快跑:未来出行的双刃剑

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 在这个日新月异的科技时代&#xff0c;无人驾驶技术正以前所未有的速度改变着我们的出行方式。萝卜快跑&#xff0c;作为自动驾驶出租车领域的佼佼者&#xff0c;其出现无疑为城市交通注入了新的活力&#xff…

政企单位光纤资源高效管理与优化策略

引言 随着信息技术的飞速发展&#xff0c;政企单位对于通信基础设施的管理要求日益提高。然而&#xff0c;传统的管理模式&#xff0c;如Excel表格记录和纸质审批流程&#xff0c;已难以满足当前复杂多变的业务需求。在此背景下&#xff0c;我们实施了光纤管理的数字化转型项目…

双栈实现一个队列

两个栈可实现将列表倒序&#xff1a;设有含三个元素的栈 A [1,2,3] 和空栈 B [] 。若循环执行 A 元素出栈并添加入栈 B &#xff0c;直到栈 A 为空&#xff0c;则 A [] , B [3,2,1] &#xff0c;即栈 B 元素为栈 A 元素倒序。 利用栈 B 删除队首元素&#xff1a;倒序后&am…

电商出海第一步,云手机或成重要因素

电商出海第一步并非易事&#xff0c;挑战和机遇并存&#xff0c;出海企业或个人或将借助云手机从而达成商业部署全球化的目的&#xff1b; 下面我们从网络稳定、数据安全、成本、以及多平台适配方面来看&#xff0c;究竟为什么说云手机会成为出海的重要因素&#xff1b; 首先…

西门子大手笔又买一家公司,2024年“两买”和“两卖”的背后……

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 更多的海量【智能制造】相关资料&#xff0c;请到智能制造online知识星球自行下载。 今年&#xff0c;这家全球工业巨头不仅精准出击&#xff0c…

【信创国产化】Nacos 2.3.2连接达梦数据库

JeecgBoot 目前提供的nacos版本号 2.3.2已经支持与达梦数据库对接。 jeecg-boot/jeecg-server-cloud/jeecg-cloud-nacos项目默认加入了达梦驱动和yml配置。如果你是老代码&#xff0c;可以参考下面的步骤手工集成 项目地址&#xff1a;https://github.com/jeecgboot/JeecgBoot…