227. 基本计算器 II

227. 基本计算器 II

  • 原题链接:
  • 完成情况:
  • 解题思路:
  • 参考代码:
    • _227基本计算器II_单栈直接算
    • _227基本计算器II_双栈
  • 错误经验吸取

原题链接:

227. 基本计算器 II

https://leetcode.cn/problems/basic-calculator-ii/

完成情况:

在这里插入图片描述

解题思路:

这段代码是一个用于计算表达式的类。它使用两个栈opersnums来存储运算符和操作数。在calculate函数中,它遍历输入的字符串表达式s,根据不同的情况进行处理。具体来说:

  1. 如果遇到空格,则跳过。
  2. 如果遇到左括号(,将其压入opers栈中,并检查下一个字符是否为负号-,若是,则将0压入nums栈中,并将负号-压入opers栈中。
  3. 如果遇到右括号),则不断计算直到遇到左括号(
  4. 如果遇到数字字符,则将连续的数字字符转换为整数,并压入nums栈中。
  5. 如果遇到运算符,则与栈顶运算符比较优先级,若当前运算符优先级小于等于栈顶运算符,则进行计算,直到栈顶运算符优先级小于当前运算符,然后将当前运算符压入opers栈中。
  6. 最后,当遍历完整个表达式后,不断计算直到opers栈为空,并返回nums栈顶元素作为最终计算结果。

cal函数用于实际计算操作数和运算符的结果,并将结果压入nums栈中。

这段代码实现了一个简单的表达式计算器,支持加减乘除取模和幂运算。

参考代码:

_227基本计算器II_单栈直接算

package leetcode板块;import java.util.ArrayDeque;
import java.util.Deque;public class _227基本计算器II_单栈直接算 {/*** String类型实现双栈* @param s* @return*/public int calculate(String s) {//双栈实现,一个栈存储数字,一个栈存储计算式//然后就是数字栈还需要往后看一个,因为如果是连续的数字,那么说明其实他们同属于一个数值Deque<Integer> myStack = new ArrayDeque<Integer>();char preSign = '+';int num = 0;int n = s.length();for(int i = 0;i<n;++i){if (Character.isDigit(s.charAt(i))){num = num*10 + s.charAt(i) - '0';}if (!Character.isDigit(s.charAt(i)) && s.charAt(i) != ' '|| i == n-1){switch (preSign){case '+':myStack.push(num);break;case '-':myStack.push(-num);break;case '*':myStack.push(myStack.pop() * num);break;case '/':myStack.push(myStack.pop() / num);break;}preSign = s.charAt(i);num = 0;}}int res = 0;while (!myStack.isEmpty()){res += myStack.pop();}return res;}
}

_227基本计算器II_双栈

package leetcode板块;import java.util.ArrayDeque;
import java.util.Deque;
import java.util.HashMap;
import java.util.Map;public class _227基本计算器II_双栈 {//这里的优先级划分按照「数学」进行划分即可Map<Character,Integer> map = new HashMap<>(){{put('-',1);put('+',1);put('*',2);put('/',2);put('%',2);put('^',3);}};/**** @param s* @return*/public int calculate(String s){/*实例:输入:s = " 3+5 / 2 "输出:5*///先去除掉所有的空格s = s.replaceAll(" ","");//将字符串转化成字符数组char [] chars = s.toCharArray();int n = s.length();//构建数字栈Deque<Integer> nums = new ArrayDeque<Integer>();//构建操作符栈Deque<Character> options = new ArrayDeque<>();//为了防止第一个数是负数,且我们没有在一开始就考虑正负号的问题,所以在最外层//所以一开始先加一个0nums.addLast(0);for (int i = 0;i<n;i++){char ch = chars[i];if (ch == '('){  //遇到左括号,必定最高优先添加options.add(ch);}else if (ch == ')'){   //遇到右括号,那么就赶紧把栈里面都计算掉while (!options.isEmpty()){if (options.peekLast() != '('){calcNumsAndOptions(nums,options);}else {options.pollLast();break;}}}else {if (isNumber(ch)){int u = 0;int j = i;//判断是否会有连续数字while (j < n && isNumber(chars[j])){u = u*10 + (chars[j++] - '0');}nums.addLast(u);i = j - 1;}else {if (i>0 && (chars[i-1] == '(' || chars[i-1] == '+' || chars[i-1] == '-')){nums.addLast(0);}// 有一个新操作要入栈时,先把栈内可以算的都算了// 只有满足「栈内运算符」比「当前运算符」优先级高/同等,才进行运算while (!options.isEmpty() && options.peekLast() != '('){char prev = options.peekLast();if (map.get(prev) >= map.get(ch)){calcNumsAndOptions(nums,options);}else {break;}}options.addLast(ch);}}}//将剩余的计算完while (!options.isEmpty()){calcNumsAndOptions(nums,options);}return nums.peekLast();}/**** @param ch* @return*/private boolean isNumber(char ch) {return Character.isDigit(ch);}/**** @param nums* @param options*/private void calcNumsAndOptions(Deque<Integer> nums, Deque<Character> options) {if (nums.isEmpty() || nums.size() < 2)  return;if (options.isEmpty())  return;int b = nums.pollLast(),a = nums.pollLast();char ops = options.pollLast();int res = 0;if (ops == '+'){res = a+b;}else if (ops == '-'){res = a-b;}else if (ops == '*'){res = a*b;}else if (ops == '/'){res = a/b;}else if (ops == '^'){res = (int)Math.pow(a,b);}else if (ops == '%'){res = a%b;}nums.addLast(res);}
}

错误经验吸取

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

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

相关文章

ubuntu入门

基础命令 cd 切换命令 ls 查看当前目录下所有的文件 cp a.c b.c 拷贝a.c 到 b.c touch a.c 创建a.c文件 mkdir file 创建文件夹file rm file 删除文件 rmdir 删除test文件夹 rmdir test/ mv 移动文件 mv a.c b.c 把a.c 替换成b.c ifconfig 查看电脑网络信息 rm xx 删…

C/C++基础语法练习 - ASCII码(新手推荐阅读✨)

题目链接&#xff1a;https://www.starrycoding.com/problem/159 题目描述 给一个仅包含大小写字母和数字的字符串&#xff0c;请输入它的每个字符对应的ASCII码。 输入格式 一行输入一个字符串 S ( 1 ≤ ∣ S ∣ ≤ 1000 ) S(1 \le |S| \le 1000) S(1≤∣S∣≤1000)。 输…

在Ubuntu linux操作系统上操作MySQL数据库常用的命令

检查是否安装了MySQL&#xff0c;或检查MySQL的状态&#xff1a; sudo systemctl status mysql或 sudo systemctl status mysql.service如果mysql有安装&#xff0c;上面这条命令会返回mysql的状态active或inactive。 卸载mysql数据库 第一步是停了数据库&#xff1a; sud…

精通GDBus:Linux IPC的现代C接口

目录标题 1. GDBus介绍2. GDBus的优点3. 安装GDBus4. 使用GDBus连接到D-Bus总线实现D-Bus服务调用D-Bus方法发送和接收信号 5. 总结 在Linux环境下&#xff0c;不同的程序需要通过某种方式进行通信和协同工作。GDBus是GLib库的一部分&#xff0c;提供了一个基于GObject系统的、…

typescript:vscode的settings配置文件配置ts语法提示

typescript&#xff1a;vscode的settings配置文件配置ts语法提示 1 找到vscode左下角的齿轮按钮 2 点击Settings&#xff08;或者快捷键ctrl,&#xff09;&#xff1a; 点击右上角的Open Settings(JSON)按钮打开配置文件&#xff1a; 或者ctrlshiftp&#xff0c;搜索settings&…

Spring - 9 ( 10000 字 Spring 入门级教程 )

一&#xff1a; MyBatis XML 配置文件 Mybatis 的开发有两种方式&#xff1a; 注解XML 我们已经学习了注解的方式, 接下来我们学习 XML 的方式 MyBatis XML 的方式需要以下两步: 配置数据库连接字符串和 MyBatis写持久层代码 1.1 配置连接字符串和 MyBatis 此步骤需要进…

2024.阳光能源追光计划暨大陆考察团交流分享会

近日大陆考察团抵达香港&#xff0c;受到了本司热情接待和安排。公司于4月27日下午举办了阳光能源追光计划主题交流会。 会上公司营销部总监张超&#xff0c;分享了阳光能源近几年的能源发展之路及公司新推出的追光计划&#xff0c;得到了大陆考察交流团团长杨国均先生的高度赞…

【自研网关系列】过滤器链 -- 灰度发布过滤器

&#x1f308;Yu-Gateway&#xff1a;&#xff1a;基于 Netty 构建的自研 API 网关&#xff0c;采用 Java 原生实现&#xff0c;整合 Nacos 作为注册配置中心。其设计目标是为微服务架构提供高性能、可扩展的统一入口和基础设施&#xff0c;承载请求路由、安全控制、流量治理等…

LLM应用:让大模型prompt总结生成Mermaid流程图

生成内容、总结文章让大模型Mermaid流程图展示&#xff1a; mermaid 美人鱼, 是一个类似 markdown&#xff0c;用文本语法来描述文档图形(流程图、 时序图、甘特图)的工具&#xff0c;您可以在文档中嵌入一段 mermaid 文本来生成 SVG 形式的图形 Prompt 示例&#xff1a;用横向…

【机器学习-19】集成学习---投票法(Voting)

一、引言 集成学习&#xff08;Ensemble Learning&#xff09;是机器学习领域中的一种重要策略&#xff0c;它通过结合多个模型的预测结果来提高整体性能。在单个模型容易过拟合或欠拟合的情况下&#xff0c;集成学习能够通过综合多个模型的优点来减少这种风险&#xff0c;从而…

第9篇:创建Nios II工程之读取Switch的值<二>

Q&#xff1a;上一期我们完成了Quartus硬件工程部分&#xff0c;本期我们创建Nios II软件工程这部分。 A&#xff1a;创建完BSP和Nios II Application之后&#xff0c;在source文件main.c中添加代码&#xff1a;system.h头文件中新增了Switch PIO IP的硬件信息&#xff0c;包括…

FineBI学习:K线图

效果图 底表结构&#xff1a;日期、股票代码、股票名称、开盘价、收盘价、最高价、最低价 步骤&#xff1a; 横轴&#xff1a;日期 纵轴&#xff1a;开盘价、最低价 选择【自定义图表】&#xff0c;或【瀑布图】 新建字段&#xff1a;价差&#xff08;收盘-开盘&#xf…