Java实现简单四则运算

2024-09-03 01:08

本文主要是介绍Java实现简单四则运算,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

工作之余,突然想用java实现一下四则运算,经过简单的构思,很快就有了思路,就完成了一个简单版本。

 

经过慎重考虑,觉得使用栈还是要比数组或者List容易对符号和数字进行控制。

我使用两个栈,分别保存数字和符号,然后判断当前符号和前一个符号的运算级别,来决定是否进行一次弹栈运算(就是挨着前一个运算符号的两个数,是不是有必要进行一次运算)。

经过简单的测试,标准的四则运算,在下面代码是没有问题的。

如果再加括号,那就是在这个基础上,添加去括号的流程就可以,等那天有时间了,再完善吧。

 

所有源码如下:

package com.rq.spring.main;import java.util.Stack;
/*** 使用栈完成的简单四则运算,不带有任何括号* 测试时,请输入标准的四则运算式* 待优化的地方很多,各位大神,多提意见* @author 任强**/
public class TestStackSimpleOperation {public static void main(String[] args) {//简单语法// Stack<String> stack = new Stack<>();//创建一个栈,字符串类型// // stack.push("a");//压栈// stack.push("b");// stack.push("c");// // while(!stack.empty()){//判断是否为空// String s = stack.pop();//弹栈// System.out.println(s);// }//另一种遍历栈的方法// Iterator<String> it = stack.iterator();// while(it.hasNext()){// String s = it.next();// System.out.println(s);// }//测试自己编写的方法// System.out.println(simpleOperation("1+2+3*5+4*6-7/7+1"));//42// System.out.println(simpleOperation("1*2*3*4*5*6+1+2*5+9*6+9"));//794// System.out.println(simpleOperation("5+6/3*8-9+45*67+95/5+8-85"));//2969System.out.println(simpleOperation("1+2+3-4+5*6-7+8-9*6/2/1+99/33*55-951"));//-780}/*** 简单四则运算* @param equation 四则运算式* @return 运算结果*/public static int simpleOperation(String equation){Stack<Integer> nums = new Stack<>();//保存运算数字的栈Stack<String> symbols = new Stack<>();//保存运算符号的栈while(equation != null && equation.length() > 0){int symIndex = getLastIndex(equation);if(symIndex == -1){//表示已经到了运算式的结尾,需要返回结果了int num = Integer.valueOf(equation);int r = getResult(num, symbols.pop(), nums.pop());while(!symbols.empty()) {r = getResult(r, symbols.pop(), nums.pop());}return r;}int num = Integer.valueOf(equation.substring(0, symIndex));nums.push(num);String sym = equation.substring(symIndex, symIndex + 1);//完成计算流程String lastSym = symbols.empty() ? null : symbols.peek();//获取前一个运算符//前一个运算符存在,且它的等级是不小于当前运算符,就进行一次运算,//把数字栈中的后两个元素弹栈操作,使用前一个运算符完成计算//使用while的原因是可能在符号栈中需要继续进行往前一步的运算while(lastSym != null && getLevel(lastSym) >= getLevel(sym)){nums.push(getResult(nums.pop(), symbols.pop(), nums.pop()));lastSym = symbols.empty() ? null : symbols.peek();}symbols.push(sym);equation = equation.substring(symIndex + 1);}return 0;}//计算结果,因为是弹栈操作,所有后弹出的数字在运算符前面private static int getResult(int a, String sym, int b){switch(sym){case "+" : return b + a;case "-" : return b - a;case "*" : return b * a;default : return b / a;}}//运算符等级,等级越高需要越先完成计算private static int getLevel(String sym){return sym.equals("+") || sym.equals("-") ? 1 : 2 ;}//最接近运算式起始的符号位置,用来确定马上要参与运算的数字和该数字之后的运算符private static int getLastIndex(String equation){int addIndex = equation.indexOf("+");int symIndex = -1;if(addIndex > -1){symIndex = addIndex;}int subIndex = equation.indexOf("-");if(subIndex > -1 && (symIndex == -1 || symIndex > subIndex)){symIndex = subIndex;}int mulIndex = equation.indexOf("*");if(mulIndex > -1 && (symIndex == -1 || symIndex > mulIndex)){symIndex = mulIndex;}int divIndex = equation.indexOf("/");if(divIndex > -1 && (symIndex == -1 || symIndex > divIndex)){symIndex = divIndex;}return symIndex;}
}

 

这篇关于Java实现简单四则运算的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1131586

相关文章

springboot集成easypoi导出word换行处理过程

《springboot集成easypoi导出word换行处理过程》SpringBoot集成Easypoi导出Word时,换行符n失效显示为空格,解决方法包括生成段落或替换模板中n为回车,同时需确... 目录项目场景问题描述解决方案第一种:生成段落的方式第二种:替换模板的情况,换行符替换成回车总结项目场景s

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

SpringBoot中@Value注入静态变量方式

《SpringBoot中@Value注入静态变量方式》SpringBoot中静态变量无法直接用@Value注入,需通过setter方法,@Value(${})从属性文件获取值,@Value(#{})用... 目录项目场景解决方案注解说明1、@Value("${}")使用示例2、@Value("#{}"php

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

Python的Darts库实现时间序列预测

《Python的Darts库实现时间序列预测》Darts一个集统计、机器学习与深度学习模型于一体的Python时间序列预测库,本文主要介绍了Python的Darts库实现时间序列预测,感兴趣的可以了解... 目录目录一、什么是 Darts?二、安装与基本配置安装 Darts导入基础模块三、时间序列数据结构与

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——