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.xdnf.cn/news/1409496.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

网络应用层之(6)L2TP协议详解

网络应用层之(6)L2TP协议 Author: Once Day Date: 2024年5月1日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文档可参考专栏&#xff1a;通信网络技术_Once-Day的…

[论文阅读] (32)南洋理工大学刘杨教授——网络空间安全和AIGC整合之道学习笔记及强推(InForSec)

首先祝大家五一节快乐&#xff01;《娜璋带你读论文》系列主要是督促自己阅读优秀论文及听取学术讲座&#xff0c;并分享给大家&#xff0c;希望您喜欢。由于作者的英文水平和学术能力不高&#xff0c;需要不断提升&#xff0c;所以还请大家批评指正&#xff0c;非常欢迎大家给…

安卓四大组件之ContentProvider

目录 前言一、ContentProvider基础介绍1.1 简介1.2 作用1.3 实现原理 二、具体使用2.1 统一资源标识符&#xff08;URI&#xff09;2.2 MIME数据类型2.2.1 MIME类型组成2.2.2 常见的MIME类型2.2.3 ContentProvider根据 URI 返回MIME类型2.2.4 类型分类2.2.5 示例 2.3 ContentPr…

Java IO流(一)

1. IO流概述 1.1 什么是IO流 在计算机中&#xff0c;input/output&#xff08;I/O、i/o 或非正式的 io 或 IO&#xff09;是信息处理系统&#xff08;例如计算机&#xff09;与外界&#xff08;可能是人类或其他信息处理系统&#xff09;之间的通信。 输入是系统接收到的信号或…

基于ssm+vue+Mysql的药源购物网站

开发语言&#xff1a;Java框架&#xff1a;ssmJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;Maven3.…

Ubuntu系统设置中文及中文输入法(手把手,学不会打我)

前言 最近开始搞C系统编程的学习&#xff0c;整了个Ubuntu系统&#xff0c;进去发现是英文系统&#xff0c;我一开始觉得也能接受&#xff0c;就当练英文&#xff0c;反正那些命令也都是用英文&#xff0c;不过后面等我暗转了一个Chrome并且开始用这里的软件去搜问题时&#x…

【08】JAVASE-面向对象-类和对象【从零开始学JAVA】

Java零基础系列课程-JavaSE基础篇 Lecture&#xff1a;波哥 Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c;Java 仍是企业和开发人员的首选开发平台。…

Linux:冯诺依曼体系结构、操作系统、初识进程

文章目录 1.冯诺依曼体系结构总线与数据传输通路为什么有内存这个部分计算机存储结构 2.操作系统(Operator System)2.1 概念2.2 设计OS的目的2.3 理解“管理”先描述再组织 2.4 用户使用系统调用和库函数&#xff08;lib&#xff09;概念 总结 3.初识进程3.1 基本事实与引入3.2…

(1)探索 SpringAI - 基本概述

人工智能简介 A system is ability to correctly interpret external data, to learn from such data, and to use those learnings to achieve specific goals and tasks through flexible adaptation. 翻译&#xff1a;系统正确解释外部数据的能力&#xff0c;从这些数据中学…

飞腾D2000+X100 TYPE6全国产核心板

飞腾D2000X100 TYPE6核心板 产品概述 飞腾D2000X100 TYPE6核心板为增强型自主控制器核心板&#xff0c;其核心芯片CPU采用飞腾D2000/8核工业版CPU、飞腾桥片X100、双通道DDR4L插槽、PHY芯片等。 产品特点 l 基于飞腾D2000X100桥片 l 丰富的PCIE扩展资源&#xff0c;一路PCIE…

大面积车间降温用什么方法

生产车间降温用什么设备好&#xff0c;生产车间降温设备的选择取决于多种因素&#xff0c;如车间的大小、高度、通风条件、预算以及员工的工作环境需求等。以下是一些常见的生产车间降温设备及其特点&#xff1a; 工业风扇&#xff08;包括大型吊扇&#xff09;&#xff1a; …

街道征迁项目档案管理系统

街道征迁项目档案管理系统是一个用于管理街道征迁项目档案的软件系统。该系统的主要功能包括档案录入、档案存储、档案检索、档案共享等。 系统的用户可以通过该系统录入征迁项目相关的档案信息&#xff0c;包括项目名称、征迁范围、土地面积、征迁补偿费用等。同时&#xff0c…

el-table分页多选导出excel表格

需求&#xff1a;使用el-table分页查询表格的时候记录上一页已选中的数据&#xff0c;之后点击导出按钮后对表格已选中数据导出excel表格&#xff0c;导出成功后清空选中的状态&#xff0c;本文章只记录分页导出的关键代码&#xff0c;其中包含之前的导出全部表格&#xff0c;导…

2024五一数学建模C题Python代码+结果表数据教学

2024五一数学建模竞赛&#xff08;五一赛&#xff09;C题保姆级分析完整思路代码数据教学 C题 煤矿深部开采冲击地压危险预测 第一问 导入数据 以下仅展示部分&#xff0c;完整版看文末的文章 import numpy as np import pandas as pd import matplotlib.pyplot as plt imp…

Edge浏览器新特性深度解析,写作ai免费软件

首先&#xff0c;这篇文章是基于笔尖AI写作进行文章创作的&#xff0c;喜欢的宝子&#xff0c;也可以去体验下&#xff0c;解放双手&#xff0c;上班直接摸鱼~ 按照惯例&#xff0c;先介绍下这款笔尖AI写作&#xff0c;宝子也可以直接下滑跳过看正文~ 笔尖Ai写作&#xff1a;…

python u是什么意思

u&#xff1a;表示unicode字符串&#xff0c;默认模式&#xff0c;里边的特殊字符会被识别。 作用&#xff1a;后面字符串以unicode格式进行编码&#xff0c;一般用在中文字符串前面&#xff0c;防止因为源码储存格式问题&#xff0c;导致再次使用时出现乱码。 用法&#xff…

分享天某云对象存储开发的体验

最近体验了天某云对象存储的功能&#xff0c;作为一名资深开发者&#xff0c;开发体验差强人意&#xff0c;与阿里云存在一定的差距。 首先在开发文档上居然没有基于nodejs的代码示例&#xff0c;只有java,c#,go等的代码示例&#xff0c;虽然有javascript的&#xff0c;但那也只…

24 JavaScript学习:this

this在对象方法中 在 JavaScript 中&#xff0c;this 的值取决于函数被调用的方式。在对象方法中&#xff0c;this 引用的是调用该方法的对象。 让我们看一个简单的例子&#xff1a; const person {firstName: John,lastName: Doe,fullName: function() {return this.firstN…

牛客NC368 质数的计数【中等 基础数学,数论 C++/Java/Go/PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/190167d1990442da9adb133980259a27 思路 判断x是否是质数&#xff1a;这是判断质数最好的代码了public boolean isPrime(int x){if(x 2 || x3) return true;if(x%6!1 && x%6!5) return false; //不在6倍…

macOS13中切换不同jdk的“笨“方法

1.用以下命令先查看自己的jdk有哪些版本 /usr/libexec/java_home -V 2.sudo vim /etc/profile 修改前&#xff0c;jdk->1.8 修改后 source ~/.bash_profile