牛客 - HJ50 四则运算 - AC CODE

news/2025/3/3 11:40:17/文章来源:https://www.cnblogs.com/Muhuai/p/18747856

牛客 - HJ50 四则运算

描述

对于输入的表达式,保证其形式合法,计算过程中全程合法,计算过程中不需要使用到实数。
结果 ans 在 [-1000, 1000] 范围内。
直接输出计算结果。

保证表达式字符串由 0-9 的数字、加法'+'、减法'-'、乘法'*'、除法'/'、小括号'()'、中括号'[]'、大括号'{}'组成,且运算符之间没有空格。

输入描述

输入一个长度在 [1, 1000] 范围、由题面所述符号构成的字符串,代表一个表达式。

输出描述

输出一个整数 ans,代表计算的答案,答案满足 [-1000, 1000] 范围

示例

输入

3+2*{1+2*[-4/(8-6)+7]}

输出

25

AC CODE

思路

  1. 第一个出现的数字和符号直接入栈
  2. 遇到数字直接入栈
  3. 遇到符号,先判断当前符号和栈顶符号的运算优先级,栈顶优先级更高,则取数字栈的2个栈顶运算;当前符号优先级更高则入栈
  4. 最后反复取数字栈的2个栈顶和符号栈栈顶运算,直到符号栈为空或只剩下一个数字

AC CODE

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;public class HJ50 {public static Integer Calculate(Character op, Integer a, Integer b) { // 运算函数if (op == '-') {return a - b;} else if (op == '+') {return a + b;} else if (op == '*') {return a * b;} else {return a / b;}}public static boolean ComparOpFirst(Character top, Character op) { // 符号优先级判断,当前符号优先级大于栈顶,返回trueif (top == '(') { // '('的优先级最高return true;} else if (op == '+' || op == '-') { // + - 的优先级最低return false;} else if (op == '*' || op == '/') { // * / 的优先级只比'('低,'('后的第一个操作符一定会入栈,所以 * / 不会与'('比较return true;} else { // 默认truereturn true;}}public static void main(String[] args) {String strt = new String();try (Scanner scanner = new Scanner(System.in)) {strt = scanner.nextLine(); // 算式输入}// 输入数据处理,括号替换只是为了方便处理strt = strt.replace('{', '(');strt = strt.replace('}', ')');strt = strt.replace('[', '(');strt = strt.replace(']', ')');List<Integer> nums = new ArrayList<>(); // 数据栈List<Character> ops = new ArrayList<>(); // 符号栈boolean opFlag = true; // 第一个符号标记String data = new String(); // 数字str,使用String拼接数字,以便使用valueOf方法data = ""; // 初始化for (int h = 0; h < strt.length(); h++) {if (strt.charAt(h) >= '0' && strt.charAt(h) <= '9') { // 当前是数字时向后遍历,直到遍历出非数字while (h < strt.length() && strt.charAt(h) >= '0' && strt.charAt(h) <= '9') { // 数字识别data += strt.charAt(h);h++; // 此处直接h++遍历数字,后续被操作的就是符号}nums.add(Integer.valueOf(data)); // 数字入栈if (h >= strt.length()) { // 遍历到算式末尾了break;}}if (strt.charAt(h) == '-') { // 减号特殊处理if (h == 0 || strt.charAt(h - 1) == '(') { // 表示负号,负号只出现在算式开头或'('之后,默认当算式中出现负数时,需要加小括号data += strt.charAt(h);continue; // 跳过,直接识别下一字符,下一字符一定是数字}}data = ""; // 数字重置,因为前面已经遍历到非数字位时才会停止,因此每次遍历完都要数字String重置if (opFlag) { // 第一个四则运算符还没入栈opFlag = false;ops.add(strt.charAt(h)); // 直接入栈continue; // 跳过}if (strt.charAt(h) == '(') {ops.add(strt.charAt(h)); // 左括号直接入栈opFlag = true; // 左括号入栈后,要重新入栈括号后第一次出现的操作符continue; // 跳过}if (strt.charAt(h) != ')') { // 遇到四则运算符if (ComparOpFirst(ops.get(ops.size() - 1), strt.charAt(h))) { // 操作符优先级高于栈顶ops.add(strt.charAt(h)); // 入栈} else { // 栈顶优先级更高,需要运算栈顶// 反复运算栈顶,直到栈空或者栈顶的优先级低于当前,只运算栈顶后就跳出,会有这种情况// 比如出现 + / - 的操作组合,运算完 / 之后,运算完 + 才能运算 -while (nums.size() >= 2 && ops.size() != 0&& (!ComparOpFirst(ops.get(ops.size() - 1), strt.charAt(h)))) {// 取数字栈顶的两个元素Integer b = nums.get(nums.size() - 1);nums.remove(nums.size() - 1);Integer a = nums.get(nums.size() - 1);nums.remove(nums.size() - 1);// 取符号栈顶Character op = ops.get(ops.size() - 1);ops.remove(ops.size() - 1);Integer tAnser = Calculate(op, a, b); // 运算nums.add(tAnser); // 结果入栈}ops.add(strt.charAt(h)); // 操作符入栈}}if (strt.charAt(h) == ')') { // 遇到')'则反复运算栈顶,直到遇到'('或者空栈while (nums.size() >= 2 && ops.size() != 0 && ops.get(ops.size() - 1) != '(') {// 取数字栈顶的两个元素Integer b = nums.get(nums.size() - 1);nums.remove(nums.size() - 1);Integer a = nums.get(nums.size() - 1);nums.remove(nums.size() - 1);// 取符号栈顶Character op = ops.get(ops.size() - 1);ops.remove(ops.size() - 1);Integer tAnser = Calculate(op, a, b); // 运算nums.add(tAnser); // 结果入栈}ops.remove(ops.size() - 1); // 左括号出栈}}while (nums.size() >= 2) { // 数字栈里面还有数字,则反复运算到只剩一个数字// 取数字栈顶的两个元素Integer b = nums.get(nums.size() - 1);nums.remove(nums.size() - 1);Integer a = nums.get(nums.size() - 1);nums.remove(nums.size() - 1);// 取符号栈顶Character op = ops.get(ops.size() - 1);ops.remove(ops.size() - 1);Integer tAnser = Calculate(op, a, b); // 运算nums.add(tAnser); // 结果入栈}System.out.println(nums.get(0));}
}

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

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

相关文章

拓普微智能显示模块:电子负载测试设备的理想显示与控制解决方案

在电子负载测试设备领域,精准、稳定、高效的操作体验至关重要。拓普微智能显示模块凭借其卓越的抗干扰能力、灵活的光标显示以及便捷的物理键盘输入功能,成为电子负载测试设备显示与控制模块的理想选择。 电子负载设备1电子负载设备2 拓普微智能显示模块优势 1. 抗干扰…

Centos 7 安装 python3.8

由于服务器的操作系统比较老,自带的python只是2.7.5版本,一些python脚本只能在python3中运行,所以必须按照python3注:在Linux中python2和python3是可以共存的安装步骤 下载安装包 # 如果网速慢可以使用浏览器下载,然后上传至服务器 wget https://www.python.org/ftp/pytho…

gRPC在.net中的使用

前言gRPC 是一种高性能、开源的远程过程调用(RPC)框架,基于 HTTP/2 协议,支持双向流、头部压缩等特性。它默认使用 Protocol Buffers(Protobuf)作为接口定义语言(IDL)和数据序列化格式,适用于微服务、实时通信等场景。我们可以结合常用的http服务来了解它。本质上讲,…

ABB机器人安全面板维修的关联

在现代工业生产中,ABB机器人扮演着至关重要的角色。然而,就像任何复杂的设备一样,它们也会遭遇故障,这时候工业机器人维修就显得尤为关键。一、ABB机器人故障与安全面板维修的关联ABB机器人故障可能出现在各个部件和功能模块上。其中,安全面板的故障是不容忽视的一部分。当…

Spring AI与DeepSeek实战一:快速打造智能对话应用

本文将手把手教你如何通过 Spring AI 集成 DeepSeek 接口实现普通对话与流式对话功能,助力你的 Java 应用轻松接入 AI 能力!一、概述 在 AI 技术蓬勃发展的今天,国产大模型 DeepSeek 凭借其 低成本、高性能 的特点,成为企业智能化转型的热门选择。而 Spring AI 作为 Java 生…

机器学习特征筛选:向后淘汰法原理与Python实现

向后淘汰法(Backward Elimination)是机器学习领域中一种重要的特征选择技术,其核心思想是通过系统性地移除对模型贡献较小的特征,以提高模型性能和可解释性。该方法从完整特征集出发,逐步剔除不重要的特征,最终保留对预测结果最具影响力的变量子集。 https://avoid.over…

模板设计模式--java进阶day03

1.模板设计模式说到模板,我们第一时间想到的可能就是写作文不过这样写就是一篇完整的作文,我们应该进行修改这样修改还会存在一个问题,每一个人写的作文不同,中间的body()无法描述清楚,所以我们要将其改为抽象方法这时模板就已经写好了,当我们想写作文时,继承该模板并…

Docker部署数据库--高斯DB(opengauss)

Docker部署高斯DB整体步骤: 1、获取镜像; 2、创建并配置容器; 3、连接使用;01、获取镜像 docker pull enmotech/opengauss:latest02、启动并配置容器 启动容器 docker run --name OpenGauss \ --privileged=true -idt \ --restart=always \ -u root \ -p 15432:5432 \ -e G…

74. 搜索二维矩阵(中)

目录题目题解:数组扁平化+二分查找 题目给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非严格递增顺序排列。 每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。题解:数组扁平…

储运效率翻倍!物联网技术让油库管理迈向新高度

随着物联网(IoT)、人工智能(AI)和大数据技术的快速发展,传统油库管理模式正在向高度自动化的方向转型。现代油库自动化系统通过传感器、智能设备、数据通信和云端平台的协同工作,实现了从储运管理到安全监控的全流程智能化。以下是油库自动化运行的核心机制和关键环节:数…

R语言中快速生成多个有色差的颜色

001、library(randomcoloR) palette <- randomColor(count = 54) #随机生成60种颜色,其实里面有重复的 palette <- distinctColorPalette(54) #差异明显的60种 palette plot(1:54, pch = 19, cex = 2, col = palette) 。

SAP ABAP里存在类似的集合工具类

实现方式-:传统的实现 "定义一个Table Line类型为通用的对象引用(TYPE REF TO OBJECT)的内表lt_shape,用于存放圆形和长方形的实例对象引用。TYPES:BEGIN OF TY_SHAPE, SHAPE TYPE REF TO OBJECT, END OF TY_SHAPE.TYPES:TT_SHPAE TYPE STANDARD TABLE OF T…