字符串的四则运算表达式

面试题 简单的字符串表达式四则运算(不考虑括号) 题目要求 简单四则运算 问题描述: 输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值 注 1、表达式只含 +, -, *, / 四则运算符,不含括号 2、表达式数值只包含个位整数(0-9),且不会出现0作为除数的情况 3、要考虑加减乘除按通常四则运算规定的计算优先级 4、除法用整数除法,即仅保留除法运算结果的整数部分。比如8/3=2。输入表达式保证无0作为除数情况 阅读详情
	public static void main(String[] args) {
        // 支持括号 小数 负数
		String statement = "-10/(4.5+5.5)*(-4-6+20)/-2"; // 10/(-2) 也行
		System.out.println(calculate(statement));
	}

    @SuppressWarnings("unchecked")
	private static double calculate(String statement){
		Object[] result = filter(statement);
		// 运算数字
		List<Double> numList = (List) result[0];
		// 运算符
		List<Character> symbolList = (List) result[1];
		while (!symbolList.isEmpty()) {
			int index = symbolList.indexOf('(');
			if (index == -1) {
				// 没有括号正常运算
				realCalculate(numList, symbolList);
			} else {
				int right = symbolList.indexOf(')');
				if (right == index + 1) {
					// 括号内的值都取完了,删除括号
					symbolList.remove(index);
					symbolList.remove(index);
					continue;
				}
				// 左右括号齐全 先算括号内的
				if (right != -1) {
					List<Double> doubles = numList.subList(index, right);
					List<Character> subChars = symbolList.subList(index + 1, right);
					realCalculate(doubles, subChars);
				}
			}
		}
		return numList.get(0);
	}

	/**
	 * @return 一个包含数字的列表和一个包含运算符的列表
	 */
	private static Object[] filter(String statement) {
		// 形式 123,456,789 可能会有空字符串
		StringBuilder nums = new StringBuilder();
		// 符号列表
		List<Character> symbolList = new LinkedList<>();
		for (int i = 0; i < statement.length(); i++) {
			char c = statement.charAt(i);
			if (c == '-' && (i == 0 || statement.charAt(i - 1) == '(' 
			|| statement.charAt(i - 1) == '*' || statement.charAt(i - 1) == '/')) {
				nums.append(c).append(statement.charAt(i + 1));
				i++;
			} else if (Character.isDigit(c) || c == '.') {
				nums.append(c);
			} else {
				symbolList.add(c);
				nums.append(',');
			}
		}

		String[] ss = nums.toString().split(",");
		List<Double> numList = new ArrayList<>();
		for (String num : ss) {
			if (!num.isEmpty()) {
				numList.add(Double.parseDouble(num));
			}
		}
		return new Object[]{numList, symbolList};
	}

	private static void realCalculate(List<Double> numList, List<Character> symbolList) {
		while (!symbolList.isEmpty()) {
			int index = symbolList.indexOf('*'), tmp;
			double value = 0.0D;
			if (index != -1 && (tmp = symbolList.indexOf('/')) != -1) {
				// 同时出现 * / 从左至右运算
				if (index < tmp) {
					value = numList.remove(index) * numList.remove(index);
				} else {
					index = tmp;
					value = numList.remove(index) / numList.remove(index);
				}
			} else if (index != -1) {
				value = numList.remove(index) * numList.remove(index);
			} else if ((index = symbolList.indexOf('/')) != -1) {
				value = numList.remove(index) / numList.remove(index);
			} else if ((index = symbolList.indexOf('+')) != -1 && (tmp = symbolList.indexOf('-')) != -1) {
				// 同时出现 + - 从左至右运算
				if (index < tmp) {
					value = numList.remove(index) + numList.remove(index);
				} else {
					index = tmp;
					value = numList.remove(index) - numList.remove(index);
				}
			} else if (index != -1) {
				value = numList.remove(index) + numList.remove(index);
			} else if ((index = symbolList.indexOf('-')) != -1) {
				value = numList.remove(index) - numList.remove(index);
			}
			// 删除运算符
			symbolList.remove(index);
			// 将计算结果放回列表,待下次计算
			numList.add(index, value);
		}
	}
总结一下

我的方法是先从括号的算起,根据运算符索引查找运算数索引,从而进行计算,算完后删除运算符和运算数,并将运算结果放回待运算的列表

公式解析类(字符串公式,自定义函数公式) 公式解析类(字符串公式,自定义函数公式) 来自网络经过部分修改 立即下载

相关推荐

跟着团子学SAP CO:基于成本的完工百分比结算:Cost-based POC(以项目为例)

本文以英国及北美会计准则下的基于成本的POC的销售型项目结算对PS模块中的完工百分比进行介绍

Lucas1211的博客 2万+

字符串四则运算

字符串四则运算

grllery的博客 2422

硬件测试入门--环路响应(Bode)测试

环路分析的一个重要作用就是分析开关电源的稳定性。扫频测试原理主要是给开关电源电路注入一个频率变化的正弦信号,测量开关电源在频域上的特性,通过分析穿越频率、增益裕度和相位裕度来判断环路是否稳定,可以为电子工程师设计稳定的控制电路提供直观的数据。开关电源的稳定性关系到整个应用系统的可靠性,利用伯德图可以看出在不同频率下系统增益的大小和相位。通过伯德图来对开关电源的环路稳定性进行判断和分析已经成为评估开关电源可靠性必不可少的方法。

songninging的博客 1万+

字符串实现大数四则运算-C++

字符串实现大数四则运算

blog.songjiahao.com 887

Unity WebGL发布避坑指南:从内存设置到字体打包,一次搞定所有常见问题

本文详细解析Unity WebGL发布的完整流程,从内存设置到字体打包,提供全面的避坑指南。涵盖关键检查清单、内存与性能优化配置、资源处理专项优化及平台适配技巧,帮助开发者高效解决常见问题,确保项目顺利发布。

weixin_28693309的博客 147

利用ArcGIS创建渔网计算渔网内土地利用占比划分中国北方农牧交错带

依据土地利用数据,根据参考文献划分要求,利用ArcGIS创建渔网对地物进行重分类,划分农业带、牧业带以及农牧交错带。

m0_60672527的博客 3060

字符串进行四则运算

需求进阶:前端选择对应的 key,后端根据key 去做查询 或者 计算后 转换为 对应的数字,然后在将数字带入 字符串中,替换掉key,进行计算最终结果;例如前端输入字符串为: price * num * discNum - surplusMoney。price ,num,discNum 等这些通用选择,或者 用户主动输入。需求:在前端输入字符串,后端(java)接受到后进行四则运算,返回计算结果给前端。前端界面只能通过选择计算符号,不手工收入。...

qq_30515213的博客 1142

亚马逊爬虫实战:中国商家信息(电话)爬取

import os), # 保存图片的路径# 搜索关键词"keywords":["毛巾","衣服"],"product_number": 1000000000000000, # 分页获取数量# 和url一一对应 个数要一样"remarks": ["备注1"],# 以下内容非专业人员请勿更改,请找开发人员更改. 对应的是amazon_product_url_setting文件中名称.},

youbingchen的博客 1524

字符串中的表达式计算

字符串中的表达式计算 思路: 如果字符串中没有括号: 每遇到一个字符,把它放进栈里(如果是数字字符,需要结合字符串将其转换成数字)。当一个数字进栈之前发现栈顶元素为*或/,则连续弹出两次栈顶,计算该表达式的结果,并把结果放入栈中。 这样做保证栈中的元素只有数字、+、-,当字符串遍历完,计算栈中的表达式就行。 如果字符串中有括号: 设计一个函数int[] value(String str,...

GoSantiago的博客 2614

2026年软考信息安全工程师备考指南

信息安全工程师是信息产业部和人事部举办的软考中新增开的一门考试。软考全称全国计算机技术与软件专业技术资格(水平)考试,这门新开的信息安全工程师分属该考试“信息系统”专业,位处中级资格,是信息产业部和人事部在最新的“国人厅发[2007]139号文件中新增的专业。2016年下半年,第一次开考信息安全工程师(中级)考试。 考试科目: 1.信息安全基础知识,考试时间为150分钟,笔试,选择题; ...

鹿鸣天涯 7397

「JS逆向三百例」JS逆向HIKVISION-视频监控的前端密码加密

本文详细分析了HIKVISION-海康威视监控前端登录过程中密码的加密机制,通过逆向工程解析了其 JavaScript 加密逻辑,重点研究了HIKVISION-海康威视监控的前端密码SHA256加密算法的实现。基于逆向分析结果,使用 Python 模拟了HIKVISION-海康威视监控的登录流程,最终实现了自动化登录功能。本文旨在为安全研究人员提供技术参考,帮助理解前端加密机制,并强调技术研究的合法性和合规性。

布啦啦 1100

计算一个字符串表示的四则运算表达式

题目大意:有字符串表示的一个四则运算表达式,要求计算出该表达式的正确数值。四则运算即:加减乘除"+-*/",另外该表达式中的数字只能是1位(数值范围0~9)。另若有不能整除的情况,按向下取整处理,eg: 8/3得出值为2。   例如若有字符串"8+7*2-9/3",计算出其值为19。     代码如下:   package com.interview; public class

1万+

ABAP CDS Time Functions 全面解析:用 TIMS_IS_VALID 护航时刻字段的正确性

摘要:本文深入解析ABAP CDS时间函数TIMS_IS_VALID的应用,重点介绍其在企业系统时间字段校验中的关键作用。文章指出无效时间数据会导致业务流程混乱,而CDS层校验能有效减少重复逻辑。详细说明TIMS类型格式要求、空值处理规则,并提供两种工程实现方案:在CDS视图中直接派生校验列,或通过ABAP SQL在内存表中批量验证。最后给出可直接运行的代码示例,包括一个ABAP报表演示内存表验证,以及一个CDS View Entity实现系统时间自动映射与校验,帮助开发者在业务场景中快速落地时间校验功能。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 193

字符串四则运算表达式的计算(华为机试)

简单四则运算 问题描述: 输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值 注 1、表达式只含 +, -, *, / 四则运算符,不含括号 2、表达式数值只包含个位整数(0-9),且不会出现0作为除数的情况 3、要考虑加减乘除按通常四则运算规定的计算优先级 4、除法用整数除法,即仅保留除法运算结果的整数部分。比如8/3=2。输入表达式保证无0作为除数情况发生 5、

ziyanguang1989的专栏 1549

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

字符串四则运算表达式求值

1. 后缀表达式 对于四则运算表达式,如 10+20-3*(10-5)+8 ,我们如何用程序实现这个运算表达式求值呢?可以使用 一种不需要括号的后缀表达法,我们也称为逆波兰(RPN)表示,如上面的例子 10+20-3*(10-5)+8,使用后缀表示法就变成了这样 10 20 + 3 10 5 - * - 8 + 我们把这样的式子称为后缀表达式,叫后缀的原因为 所有的符号都在要运算数字的后面,那么...

不会飞的纸飞机的博客 2059

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

练习:Python 的字符串处理, 一个朴实无华的四则运算计算器,批量计算小学生四则运算表达式

练习:Python 的字符串处理, 一个朴实无华的四则运算计算器,批量计算小学生四则运算表达式

m0_57158496的博客 1259

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

字符串四则运算表达式的求解(中缀表达式实现,模拟笔算的方法)

关于字符串四则运算表达式的求解,网上有很多利用变字符串为前缀表达式或后缀表达式实验的方法,本人觉得模拟笔算的方法简单易懂,这里给出了QT的具体实现,未经大量测试,仅供参考。 mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include #include namespace Ui { class Mai

xuedingkai的博客 466

Python 的字符串处理, 一个朴实无华的四则运算计算器,批量计算小学生四则运算表达式 --2023博客之星候选--城市赛道

Python 的字符串处理

weixin_45471729的博客 577

java实现字符串解析成四则运算表达式

1.java实现字符串解析成四则运算表达式。 package org.coffeesweet.util; import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; import java.util.ArrayList; import java....

feiliboos 427

as/flex 字符串解析成四则运算表达式 工具类

1.传入一个带四则运算的字符串。(如:var a:String = "2*(4-3.001)+3.5";). 2.返回值为被解析后四则运算出来的结果值。 package com.zzz { public class MathExpress { public function MathExpress() { } public static function MathExpre...

feiliboos 174

在Java中计算四则运算表达式字符串的值

在项目中有个需求,需要动态的计算一个四则运算表达式的结果,在JS中做这个非常方便,用eval表达式就搞定了,但在Java语言里就没那么容易了,上网搜了一下没有找到满意的,小弟不才,网上很多代码看不明白,唉,无奈下,自己利用Java中的正则表达式做了一个简单的包括了加减乘除及小括号的计算方法。因为时间仓促,为了赶进度,没仔细进行验证,现在贴出来,请大家拍拍砖,有什么好的解决方法,或考虑到效率问题,还...

ZYWANG--技术备忘录 706
上一篇: Java并发核心浅谈(二)
下一篇: leetcode - 189. 旋转数组
若水无言
博客等级 码龄10年 10粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值