面试遇到了这个题,里面需要用到根据配置的四则运算式(字符串型),计算公式结果,搜了之后,在网上看到这个
http://www.blogjava.net/luluyanglu/archive/2010/04/21/318964.html
因为在处理四则运算的时候最麻烦的逻辑主要是对括号内预算的处理,特别是括号的嵌套。
因此该算法主要的逻辑是,通过对括号位置的观察,得出:从左至右的扫描一个字符串,那么每一个右括号将与最近遇到的那个未匹配的左括号相匹配。这和堆栈的后进先出的规则是一样的。因此得到在扫描的过程当中,将每一个遇到的左括号进行压栈,在出现右括号的时候,出栈。
该解法相对于通过递归实现的解法,在时间复杂性上略好,并且实现出来的代码更加清晰。
package com.exam;
import java.util.ArrayList;
import java.util.LinkedList;
/**
*
* @author l
*
*/
public class Exam2 {
private boolean isRightFormat = true;
public double getResult(String formula) {
double returnValue = 0;
try {
returnValue = doAnalysis(formula);
} catch (NumberFormatException nfe) {
System.out.println("公式格式有误,请检查:" + formula);
} catch (Exception e) {
e.printStackTrace();
}
if (!isRightFormat) {
System.out.println("公式格式有误,请检查:" + formula);
}
return returnValue;
}
private double doAnalysis(String formula) {
double returnValue = 0;
LinkedList<Integer> stack = new LinkedList<Integer>();
int curPos = 0;
String beforePart = "";
String afterPart = "";
String calculator = "";
isRightFormat = true;
while (isRightFormat
&& (formula.indexOf('(') >= 0 || formula.indexOf(')') >= 0)) {
curPos = 0;
for (char s : formula.toCharArray()) {
if (s == '(') {
stack.add(curPos);
} else if (s == ')') {
if (stack.size() > 0) {
beforePart = formula.substring(0, stack.getLast());
afterPart = formula.substring(curPos + 1);
calculator = formula.substring(stack.getLast() + 1,
curPos);
formula = beforePart + doCalculation(calculator)
+ afterPart;
stack.clear();
break;
} else {
System.out.println("有未关闭的右括号!");
isRightFormat = false;
}
}
curPos++;
}
if (stack.size() > 0) {
System.out.println("有未关闭的左括号!");
break;
}
}
if (isRightFormat) {
returnValue = doCalculation(formula);
}
return returnValue;
}
private double doCalculation(String formula) {
ArrayList<Double> values = new ArrayList<Double>();
ArrayList<String> operators = new ArrayList<String>();
int curPos = 0;
int prePos = 0;
for (char s : formula.toCharArray()) {
if (s == '+' || s == '-' || s == '*' || s == '/') {
values.add(Double.parseDouble(formula.substring(prePos, curPos)
.trim()));
operators.add("" + s);
prePos = curPos + 1;
}
curPos++;
}
values.add(Double.parseDouble(formula.substring(prePos).trim()));
char op;
for (curPos = operators.size() - 1; curPos >= 0; curPos--) {
op = operators.get(curPos).charAt(0);
switch (op) {
case '*':
values.add(curPos, values.get(curPos) * values.get(curPos + 1));
values.remove(curPos + 1);
values.remove(curPos + 1);
operators.remove(curPos);
break;
case '/':
values.add(curPos, values.get(curPos) / values.get(curPos + 1));
values.remove(curPos + 1);
values.remove(curPos + 1);
operators.remove(curPos);
break;
}
}
for (curPos = operators.size() - 1; curPos >= 0; curPos--) {
op = operators.get(curPos).charAt(0);
switch (op) {
case '+':
values.add(curPos, values.get(curPos) + values.get(curPos + 1));
values.remove(curPos + 1);
values.remove(curPos + 1);
operators.remove(curPos);
break;
case '-':
values.add(curPos, values.get(curPos) - values.get(curPos + 1));
values.remove(curPos + 1);
values.remove(curPos + 1);
operators.remove(curPos);
break;
}
}
return values.get(0).doubleValue();
}
}
分享到:
相关推荐
在Java编程语言中,实现四则运算涉及到对数学表达式的解析和计算。在这个场景下,用户可以自由输入如"2 + 3 * 4"这样的简单四则运算表达式,但不支持包含括号的复杂表达式。接下来,我们将详细讨论如何在Java中构建...
在实现四则运算解析器时,可以采用递归下降解析(Recursive Descent Parsing)或者堆栈解析(Shunting Yard Algorithm,也称逆波兰表示法)等方法。递归下降解析器直接使用函数来表示文法规则,适合处理简单的表达式...
解析expression四则运算表达式 如:(1+2*3.5*(2+3)-10+18*20)
"java实现字符串四则运算公式解析工具类的方法" 今天小编将为大家分享java实现字符串四则运算公式解析工具类的方法,这个工具类能够帮助用户快速解析和计算字符串形式的四则运算公式。这个工具类被命名为...
例: Expression e = new [removed]"1+2*((3+5)/10*5*4 +(1-2)/4)"); System.out.println(e.eval());//32.5 要求jdk1.6
通过学习和理解这个Java控制台四则运算计算程序源码,开发者可以深入掌握Java语言的基础特性,如数据类型、流程控制、异常处理,以及算法设计和实现,尤其是与解析和计算数学表达式相关的部分。此外,这也是一个实践...
以下是对标题“四则运算用java实现”及描述“自己写的一个测试过的关于四则运算的java例子,可以处理小数”的详细解析。 1. **基础语法**: Java中的四则运算符包括:`+`(加法)、`-`(减法)、`*`(乘法)和`/`...
#### 一、Java四则运算基础 在计算机编程中,四则运算是最基本的数学运算之一,主要包括加法(`+`)、减法(`-`)、乘法(`*`)与除法(`/`)。对于Java这样的面向对象语言而言,实现四则运算不仅涉及到基本的数据类型操作,...
要运行这个ANTLR4实现的四则运算解析器,你需要先安装ANTLR4工具,然后使用它将.g4文件转换为Java代码。之后,你可以编写一个主程序,加载输入的表达式,使用生成的解析器和访问者执行计算。 总的来说,ANTLR4是一...
本文将详细介绍如何利用Java的堆栈数据结构来实现简单的四则运算。 四则运算,即加法(+)、减法(-)、乘法(*)和除法(/),是我们日常计算中最基本的操作。在计算机程序中,这些运算通常用于处理数学表达式。...
**标题与描述解析:**“Java四则运算计算器”是一款基于Java语言开发的计算器应用,能够执行加、减、乘、除等基本算术运算,并支持混合运算,具备友好的用户界面。描述中强调了该计算器的易用性和简洁性,适合日常...
将近250行的算法 实现了通过字符串进行加减乘除四则运算 纯通过处理字符串和数组实现 希望能帮助大家: 例如:String input "33+26 77+70"; String result ""; try { result Account...
### 四则运算JAVA计算器知识点解析 #### 一、项目概述 该项目是一个基于Java Swing的简单计算器应用程序,能够实现基本的四则运算功能,并且支持括号操作,以解决优先级问题。为了处理复杂的数学表达式,该计算器还...
JAVA四则运算的实现与优化 本文将对 JAVA 四则运算的实现进行详细的分析与解释,并对代码进行逐行解释。 一、 JAVA四则运算的实现 在 JAVA 中,四则运算的实现可以使用基本的运算符和数据类型来实现。在本文中,...
### Java编写的大整数四则运算:深入解析与理解 #### 概述 在计算机科学领域,处理大整数运算是一项挑战,特别是在超出标准整数类型(如`int`或`long`)所能表达的范围时。Java语言通过内置的`BigInteger`类提供了...
在Java编程语言中,实现四则运算涉及到将数学表达式解析、转换并计算的过程。这里主要涉及两个关键步骤:1) 将中缀表达式(常见的运算符在操作数之间的形式)转换为后缀表达式(也称为逆波兰表示法,运算符在操作数...
在这个“基于SLR文法的整数加减乘除四则运算”项目中,我们主要关注的是如何用SLR方法解析和执行基本的算术表达式,即整数之间的加、减、乘、除操作。这通常涉及到以下步骤: 1. **文法定义**:首先,我们需要定义...
在编写代码时我们有时候会碰到需要自己解析四则运算表达式的情况,本文简单的介绍使用JavaScript实现对简单四则运算表达式的解析。 一、熟悉概念 中缀表示法(或中缀记法)是一个通用的算术或逻辑公式表示方法, ...
在本项目中,"Java综合程序设计——计算器(实现运算符优先级的四则混合运算)"是一个典型的软件开发任务,旨在实现一个功能丰富的计算器,包括基础的四则运算以及更复杂的数学操作如对数和平方根。这个计算器的关键...
四则运算表达式计算器可以用多种编程语言实现,如Python、Java、C++、JavaScript等,每种语言都有其特有的数据结构和语法来支持这种计算。 通过以上步骤,我们可以创建一个能够处理任意长度四则运算表达式的计算器...