【力扣刷题】数组实现栈、后缀表达式(逆波兰表达式)求值、中缀表达式转换为后缀表达式(无括号有括号)


在这里插入图片描述

🐌个人主页: 🐌 叶落闲庭
💨我的专栏:💨
c语言
数据结构
javaEE
操作系统
Redis

石可破也,而不可夺坚;丹可磨也,而不可夺赤。


刷题篇

  • 一、数组实现栈
    • 1.1 题目描述
    • 1.2 思路分析
    • 1.3 代码演示
  • 二、 后缀表达式(逆波兰表达式)求值
    • 2.1 题目描述
    • 2.2 思路分析
    • 2.3 代码演示
  • 三、中缀表达式转换为后缀表达式(无括号)
    • 3.1 题目描述
    • 3.2 思路分析
    • 3.3 代码演示
  • 四、中缀表达式转换为后缀表达式(有括号)
    • 4.1 题目描述
    • 4.2 思路分析
    • 4.3 代码演示

一、数组实现栈

1.1 题目描述

给定一个栈的接口,实现该接口中的方法,接口中的方法包括向栈顶添加元素、从栈顶弹出元素、返回栈顶元素,不弹出、判断栈是否为空、判断栈是否已满,要求使用数组实现。

  • 要实现的栈的接口:
public interface Stack<E> {/*** 向栈顶添加元素* @param value -带压入值* @return  -成功返回true,失败返回false*/boolean push(E value);/*** 从栈顶弹出元素* @return -栈非空返回栈顶元素,栈为空返回null*/E pop();/*** 返回栈顶元素,不弹出* @return -栈非空返回栈顶元素,栈为空返回null*/E peak();/*** 判断栈是否为空* @return -空返回true,非空返回false*/boolean isEmpty();/*** 判断栈是否已满* @return -满返回true,不满返回false*/boolean isFull();
}

1.2 思路分析

用数组来实现栈的方法相对比较简单,首先定义一个数组,用来模拟栈的功能,定义一个整型变量作为栈顶指针(int top),为这个数组栈定义一个带形参的构造方法,参数表示数组的默认长度(int capacity),即栈的容量。
可以将栈顶指针表示的索引值与数组长度相等时作为判定栈是否满的标志,即当top == array.length()时表示栈已满,当top == 0时表示栈为空。
压栈操作就是将要添加的值添加到数组索引为top的位置处,即向栈顶添加元素,然后top指向top+1索引处,当栈为满时,返回false表示添加失败。
出栈操作先判断栈是否为空,若栈为空,则直接返回false表示没有元素,否则拿到此时栈顶的元素,注意top表示的是下一个栈顶元素存放的位置,所以此时的栈顶元素的索引是top-1,返回数组下标为top-1的元素的值,然后top–表示失去一个元素
拿到栈顶元素且不弹出与出栈类似,不同的是,拿到栈顶元素且不弹出不需要将top自减,只需返回数组下标为top-1的元素的值即可。

1.3 代码演示

public class ArrayStack<E> implements Stack<E>,Iterable<E> {private E[] array;private int top;    //栈顶指针@SuppressWarnings("all")public ArrayStack(int capacity) {this.array = (E[]) new Object[capacity];}@Overridepublic boolean push(E value) {if (isFull()) {return false;}array[top] = value;top++;return true;}@Overridepublic E pop() {if (isEmpty()) {return null;}//找到栈顶元素E value = array[top - 1];top--;return value;}@Overridepublic E peak() {if (isEmpty()) {return null;}//找到栈顶元素E value = array[top - 1];return value;}@Overridepublic boolean isEmpty() {return top == 0;}@Overridepublic boolean isFull() {return top == array.length;}@Overridepublic Iterator<E> iterator() {return new Iterator<E>() {int p = top;@Overridepublic boolean hasNext() {return p > 0;}@Overridepublic E next() {E value = array[--p];return value;}};}
}

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

2.1 题目描述

给定一个字符串数组,这串数组是后缀表达式形式(这种表示方式把运算符写在运算对象的后面,例如,把a+b写成ab+,所以也称为后缀式。这种表示法的优点是根据运算对象和算符的出现次序进行计算,不需要使用括号,也便于用械实现求值。),要求通过代码将这串表达式的值计算出来,不需要考虑表达式的正确性,默认表达式一定有值。

2.2 思路分析

利用栈的特性对这个字符串数组进行遍历,通过对遍历到的每个元素进行判断,当遍历到的元素不是运算符时,表示这个元素是字符串类型的数字,将它转换为整型的数字并添加到栈中,当遍历到的元素是运算符时,则从栈顶弹出两个元素,并进行该运算符的计算,将计算得到的结果再次添加到栈中,当整个数组遍历完时,此时栈顶的元素就是最终的结果,直接返回栈顶元素。

2.3 代码演示

    public int evalRPN(String[] tokens) {LinkedList<Integer> stack = new LinkedList<>();for (String token : tokens) {switch (token) {case "+" : {Integer b = stack.pop();Integer a = stack.pop();stack.push(a + b);break;}case "-" : {Integer b = stack.pop();Integer a = stack.pop();stack.push(a - b);break;}case "*" : {Integer b = stack.pop();Integer a = stack.pop();stack.push(a * b);break;}case "/" : {Integer b = stack.pop();Integer a = stack.pop();stack.push(a / b);break;}default: { //数字stack.push(Integer.parseInt(token));break;}}}return stack.pop();}

三、中缀表达式转换为后缀表达式(无括号)

3.1 题目描述

给定一段字符串,该字符串是一段标准的中缀表达式(如a + b - c、a * b + d、a + b * c - d等),要求将该式转换为后缀表达式。

3.2 思路分析

利用栈的特性,在遍历字符串时每次得到一个字符,设置一个优先级判断,若这个字符是数字的话,直接将它拼接在将要返回的新字符串上,若这个字符是运算符,则先判断栈是否为空,当栈为空时,直接将该字符添加到栈中,若栈不为空,则比较当前运算符与栈顶运算符的优先级大小,若当前运算符的优先级大,则直接将该字符添加到栈中,若当前运算符优先级小,则需要先将栈中比当前运算符优先级小的全部弹出并拼接到之前的字符串中,然后再将当前运算符添加到栈中,当遍历完字符串并且栈不为空时,将栈中剩余的字符串弹出并拼接到字符串,最后返回最终的字符串。

3.3 代码演示

    static String infixToSuffix(String exp) {LinkedList<Character> stack = new LinkedList<>();StringBuilder sb = new StringBuilder(exp.length());/*** 1.遇到非运算符 直接拼串* 2.遇到 + - * /*  - 它的优先级比栈顶运算符优先级高,入栈*  - 否则把栈里优先级 >= 它 的都出栈,它再入栈* 3.遍历完成,栈里剩余运算符依次出栈*/for (int i = 0; i < exp.length(); i++) {char c = exp.charAt(i);switch (c) {case '+':case '-':case '*':case '/': {//比较运算符优先级//栈为空,直接将当前运算符压入栈中if (stack.isEmpty()) {stack.push(c);} else {if (priority(c) > priority(stack.peek())) {stack.push(c);} else {while (!stack.isEmpty() && priority(c) <= priority(stack.peek())) {sb.append(stack.pop());}stack.push(c);}}break;}default: {//直接拼串sb.append(c);break;}}}while (!stack.isEmpty()) {sb.append(stack.pop());}return sb.toString();}public static int priority(char c) {int p = 0;switch(c) {case '*':case '/': {p = 2;break;}case '+':case '-': {p = 1;break;} default: {throw new IllegalArgumentException("不合法的符号:“" + c + "“");}};return p;}

四、中缀表达式转换为后缀表达式(有括号)

4.1 题目描述

给定一段字符串,该字符串是一段标准的中缀表达式,并且这些中缀表达式中带有括号(如:(a + b) * c、(a + b * c - d) * e、(a * b)+c),要求将该式转换为后缀表达式。

4.2 思路分析

与无括号的中缀转后缀类似,只不过多了一个左括号的优先级判断,在无括号的基础上,为左括号添加一个更低的优先级,在遍历字符串时,若遇到左括号,则直接将其添加到栈中,栈中的字符(数字或运算符)判断方法不变,若遇到右括号,则将栈中从栈顶到左括号为止(不包含左括号)的所有字符弹出并拼接到最终要返回字符串,然后再将左括号弹出(这样做的目的是不拼接左括号),之后的步骤与无括号的相同,当遍历完字符串并且栈不为空时,将栈中剩余的字符串弹出并拼接到字符串,最后返回最终的字符串。

4.3 代码演示

    static String infixToSuffix(String exp) {LinkedList<Character> stack = new LinkedList<>();StringBuilder sb = new StringBuilder(exp.length());/*** 1.遇到非运算符 直接拼串* 2.遇到 + - * /*  - 它的优先级比栈顶运算符优先级高,入栈*  - 否则把栈里优先级 >= 它 的都出栈,它再入栈* 3.遍历完成,栈里剩余运算符依次出栈* 4.带()*  - 左括号直接入栈,左括号优先级设置为0*  - 右括号就把栈里的栈顶到左括号为止的所有运算符出栈*/for (int i = 0; i < exp.length(); i++) {char c = exp.charAt(i);switch (c) {case '+':case '-':case '*':case '/': {//比较运算符优先级//栈为空,直接将当前运算符压入栈中if (stack.isEmpty()) {stack.push(c);} else {if (priority(c)>priority(stack.peek())) {stack.push(c);} else {while (!stack.isEmpty() && priority(c) <= priority(stack.peek())) {sb.append(stack.pop());}stack.push(c);}}break;}case '(' : {stack.push(c);break;}case ')' : {while (!stack.isEmpty() && stack.peek() != '(') {sb.append(stack.pop());}stack.pop();break;}default: {//直接拼串sb.append(c);break;}}}while (!stack.isEmpty()) {sb.append(stack.pop());}return sb.toString();}public static int priority(char c) {int p = 0;switch(c) {case '*':case '/': {p = 2;break;}case '+':case '-': {p = 1;break;}case '(' : {p = 0;break;}default: {throw new IllegalArgumentException("不合法的符号:“" + c + "“");}};return p;}

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

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

相关文章

Filter与Listener(过滤器与监听器)

1.Filter 1.过滤器概述 过滤器——Filter&#xff0c;它是JavaWeb三大组件之一。另外两个是Servlet和Listener 它可以对web应用中的所有资源进行拦截&#xff0c;并且在拦截之后进行一些特殊的操作 在程序中访问服务器资源时&#xff0c;当一个请求到来&#xff0c;服务器首…

接口测试vs功能测试

接口测试和功能测试的区别&#xff1a; 本文主要分为两个部分&#xff1a; 第一部分&#xff1a;主要从问题出发&#xff0c;引入接口测试的相关内容并与前端测试进行简单对比&#xff0c;总结两者之前的区别与联系。但该部分只交代了怎么做和如何做&#xff1f;并没有解释为什…

【diffusion model】扩散模型入门

写在最前&#xff0c;参加DataWhale 10月组队学习。 参考资料&#xff1a; HuggingFace 开源diffusion-models-class 1.扩散模型介绍 2.调用模型生成一张赛博风格的猫咪图片 2.1 安装依赖包 %pip install -qq -U diffusers datasets transformers accelerate ftfy pyarrow9…

软件报错msvcr120.dll丢失怎么办?五个有效修复方法分享

msvcr120.dll是一个动态链接库文件&#xff0c;它是Microsoft Visual C 2012 Redistributable Package的一部分。如果你的电脑在运行一些需要这个文件的程序时出现了“msvcr120.dll丢失”的错误&#xff0c;那么就意味着你的电脑缺少了这个文件&#xff0c;或者这个文件已经损坏…

Jmeter —— 接口之间关联调用(获取上一个接口的返回值作为下一个接口的请求参数)

正则表达式&#xff1a; 具体如何操作&#xff1a; 1. 草稿保存&#xff0c; 此请求的响应数据的id 为发布总结的请求参数draft_id 2. 草稿保存的响应数据 3.在草稿保存的请求中&#xff0c;添加后置处理器- 正则表达式提取器&#xff0c; 提取响应数据的id信息 4. 发布总结请…

[架构之路-239]:目标系统 - 纵向分层 - 中间件middleware

目录 前言&#xff1a; 一、中间件概述 1.1 中间件在软件层次中的位置 1.2 什么是中间件 1.3 为什么需要中间件 1.4 中间件应用场合&#xff08;应用程序不用的底层需求&#xff1a;计算、存储、通信&#xff09; 1.5 中间件分类 - 按内容分 二、嵌入式系统的中间件 2…

TCP/IP(二十二)TCP 实战抓包分析(六)TCP 快速建立连接

一 TCP Fast Open 快速建立连接 说明&#xff1a; 之前讲解TCP 相关知识点遗漏了这个知识点,补充上 ① TFO简介 ② 请求 Fast Open Cookie过程 "原理图" ③ 真正开始 TCP Fast Open 重点&#xff1a; TFO 使 SYN包 可以包含payload 数据 ④ 抓包分析 1、…

怎样才能去除视频中的背景音乐,保留人声?

做视频剪辑&#xff0c;二次创作的朋友&#xff0c;需要去除视频中的背景音乐&#xff0c;保留人声&#xff1b;或者去除人声&#xff0c;保留背景音乐。如果请身边做视频的朋友帮忙&#xff0c;可有时不能沟通到位&#xff0c;完成后的效果并不是很理想&#xff0c;就很尴尬了…

python requests爬取税务总局税案通报、税务新闻和政策解读

文章目录 环境配置页面爬取流程税案通报爬取code税务新闻爬取政策解读爬取 环境配置 python&#xff1a;3.7 requests&#xff1a;发出请求&#xff0c;返回页面 beautifulsoup&#xff1a;解析页面 time&#xff1a;及时 warnings&#xff1a;忽视警告 页面 网址&#xff1…

聊聊设计模式--简单工厂模式

简单工厂模式 ​ 前面也学了很多各种微服务架构的组件&#xff0c;包括后续的服务部署、代码管理、Docker等技术&#xff0c;那么作为后端人员&#xff0c;最重要的任务还是代码编写能力&#xff0c;如何让你的代码写的漂亮、易扩展&#xff0c;让别人一看赏心悦目&#xff0c…

城市正视图(Urban Elevations, ACM/ICPC World Finals 1992, UVa221)rust解法

如图5-4所示&#xff0c;有n&#xff08;n≤100&#xff09;个建筑物。左侧是俯视图&#xff08;左上角为建筑物编号&#xff0c;右下角为高度&#xff09;&#xff0c;右侧是从南向北看的正视图。 输入每个建筑物左下角坐标&#xff08;即x、y坐标的最小值&#xff09;、宽度…

使用Spire.PDF for Python插件从PDF文件提取文字和图片信息

目录 一、Spire.PDF插件的安装 二、从PDF文件提取文字信息 三、从PDF文件提取图片信息 四、提取图片和文字信息的进阶应用 总结 在Python中&#xff0c;提取PDF文件的文字和图片信息是一种常见的需求。为了满足这个需求&#xff0c;许多开发者会选择使用Spire.PDF插件&…

C++特性——inline内联函数

1. 内联函数 1.1 C语言的宏 在C语言中&#xff0c;我们学习了用#define定义的宏函数&#xff0c;例如&#xff1a; #define Add(x, y) ((x) (y)) //两数相加相较于函数&#xff0c;我们知道宏替换具有如下比较明显的优点&#xff1a; 性能优势&#xff1a; 宏在预处理阶段…

将本地的项目上传到Gitee

目录 1.先在Gitee新建一个仓库,提交即可 2.进入到要上传的项目里面&#xff0c;右键选择 Git Bash Here 3.右键后就打开了Git命令窗口 4.配置你的用户名和邮箱(已经配置过则可跳过) 5.查看你的用户名和邮箱配置&#xff08;可不查看&#xff09; 6.输入git init指令&#…

【java】【重构一】分模块开发设计实战

目录 一、创建项目 1、先创建一个空项目 2、设置项目SDK等 二、创建父模块 选择springboot 1、创建父模块parent 2、删除多余文件&#xff0c;只保留pom.xml 3、修改pom.xml 4、将部分公共依赖加入到pom 三、创建实体类子模块entity 1、创建实体类子模块entity 2、…

关注用户信息卡片

效果展示 CSS 知识点 box-shadow 属性回顾CSS 变量回顾 实现页面整体布局 <div class"card"><div class"box"><!-- 视频 --><div class"vide_box"><video src"user.mp4" type"video/mp4" aut…

gulp打包vue3+jsx+less插件

最终转换结果如下 在根目录下添加gulpfile.js文件&#xff0c;package.json添加命令npm run gulp var gulp require(gulp) var babel require(gulp-babel) var less require(gulp-less) var del require(del); var spawn require(child_process).spawn;const outDir &…

Mysql数据库 1. SQL基础语法和操作

一、Mysql逻辑结构 一个数据库软件可以包含许多数据库 一个数据库包含许多表 一个表中包含许多字段&#xff08;列&#xff09; 数据库软件——>数据库——>数据表——>字段&#xff08;列&#xff09;、元组&#xff08;行&#xff09; 二、SQL语言基础语法 1.SQL…

机器学习(24)---AdaBoost(课堂笔记)

文章目录 一、知识记录二、题目2.1 题目12.2 题目22.3 答案书写 一、知识记录 二、题目 2.1 题目1 2.2 题目2 2.3 答案书写

2022年亚太杯APMCM数学建模大赛D题储能系统中传热翅片的结构优化求解全过程文档及程序

2022年亚太杯APMCM数学建模大赛 D题 储能系统中传热翅片的结构优化 原题再现 高效储能技术是解决可再生能源和余热资源波动性和间歇性的核心技术。相变蓄热以其较高的储能密度和近恒温蓄热放热而得到广泛应用。固-液相变材料具有相变前后相变潜热高、体积变化小等特点&#x…