闲着没事写了个基于List的简单表达式计算的Java实现,简陋了点。。。
import java.util.List;
import java.util.ArrayList;
public class MyCalc {
public static void main(String[] args) {
String expr = "1+3*(5-(4-3))+5";
List<String> items = parseExpr(expr);
print("Init",items);
System.out.println("result:"+calcSubExpr(items));
}
//caculate every sub expresion
private static double calcSubExpr(List<String> items){
print("Current items",items);
if(items.contains("(")){
int from=items.indexOf("(");
int to=items.lastIndexOf(")");
List<String> subList=items.subList(from+1, to);
double result=calcSubExpr(subList);
remove(items,from-1,from+3);
items.add(from-1, ""+result);
}
doMultiplyAndDivide(items);
doPlusAndNegate(items);
return Double.parseDouble(items.remove(0));
}
//remove item from items[from,to]
private static void remove(List<String> items, int from, int to) {
// TODO Auto-generated method stub
for(int i=from;i<to;i++){
items.remove(from);
}
}
//do plus or Negate
private static void doPlusAndNegate(List<String> items) {
// TODO Auto-generated method stub
print("Before Plus/Negate",items);
for (int i = 0; i < items.size(); i++) {
String item = items.get(i);
if (item.equals("+") || item.equals("-")) {
double last = Double.parseDouble(items.remove(i - 1));
items.remove(i - 1);
double next = Double.parseDouble(items.remove(i - 1));
double result = calc(last, next, item);
items.add(i - 1, "" + result);
i = i - 1;
}
}
print("After Plus/Negate",items);
}
//do muilty or devide
private static void doMultiplyAndDivide(List<String> items) {
// TODO Auto-generated method stub
print("Before Multiply/Divide",items);
for (int i = 0; i < items.size(); i++) {
String item = items.get(i);
if (item.equals("*") || item.equals("/")) {
double last = Double.parseDouble(items.remove(i - 1));
items.remove(i - 1);
double next = Double.parseDouble(items.remove(i - 1));
double result = calc(last, next, item);
items.add(i - 1, "" + result);
i = i - 1;
}
}
print("After Multiply/Divide",items);
}
private static double calc(double last, double next, String c) {
// TODO Auto-generated method stub
System.out.println("Calc() parameters:" + last + " " + next + " " + c);
char sign = c.charAt(0);
switch (sign) {
case '*':
return last * next;
case '/':
return last / next;
case '+':
return last + next;
case '-':
return last - next;
}
return 0;
}
private static List<String> parseExpr(String expr) {
// TODO Auto-generated method stub
List<String> items = new ArrayList<String>();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < expr.length(); i++) {
char c = expr.charAt(i);
if (isDelim(c)) {
items.add(sb.toString());
items.add(""+c);
sb = new StringBuilder();
} else {
sb.append(c);
}
if (i == expr.length()-1)
items.add(sb.toString());
}
return items;
}
private static boolean isDelim(char c) {
if (("+-*/%^=()".indexOf(c) != -1))
return true;
return false;
}
public static void print(String info,List<String> vecotr) {
System.out.println("Info:"+info);
System.out.println("Size:" + vecotr.size());
System.out.println("Content:" + vecotr);
}
}
分享到:
相关推荐
在这个项目中,Java 被用来编写数学表达式计算程序,展示了其在软件开发中的灵活性。 2. 知识点:课程设计 该项目作为课程设计的一部分,旨在让学生应用所学的 Java 语言知识,通过实践提高编程技能和问题解决能力...
总结来说,"Java数学表达式计算"涉及到如何在Java环境中解析和评估复杂的数学表达式。这可以通过使用Java内置的方法、第三方库如Apache Commons Math,或是自定义解析器实现。通过分析提供的`ExprEvalSample`代码,...
接下来,我们来看一个简单的Java实现,这里以"山寨版计算器"为例。这个计算器可能包括以下几个关键类: - `Token`:表示解析出的词法单元,可能包含数字、运算符、括号等。 - `Tokenizer`:词法分析器,用于将输入...
以上就是基于Java实现简易计算器的基本思路和关键步骤。实际的代码实现会更具体地涉及语法细节和逻辑处理。如果你已经有一个名为"计算器"的Java源代码文件,你可以通过编译和运行它来体验这个计算器的工作原理。
此外,`java.util.Stack`可以用来实现后缀表达式(也称逆波兰表示法)计算,这是一种简化表达式计算的方法。 该项目可能包含了错误处理机制,以识别并报告多种表达式错误,如语法错误、未定义的变量、除以零等。这...
### 使用Java正则表达式实现一个简单的身份证号码验证 #### 一、背景介绍 身份证号码是中国公民的身份标识,由15位或18位数字组成(早期为15位,后改为18位)。其中,第18位是校验码,可能是数字0~9或者大写字母X。...
总结来说,这个Java实现的简易算术表达式解析类是一个基础但实用的工具,它可以处理简单的数学问题,帮助开发者在不使用现成的解析库的情况下,快速实现对字符串表达式的计算功能。通过学习和理解这个实现,开发者...
Fel Java表达式引擎是一款轻量级且高效的开源表达式计算引擎。它的全称是FastExpressionLanguage,专门设计用于满足不断变化的功能需求和性能需求。Fel的执行方式主要依赖于函数,运算符如加减乘除等被视为Fel函数,...
Java解析表达式是一个常见的需求,特别是在需要动态计算或者执行用户输入的简单脚本时。JEXL(Java Expression Language)是Apache Commons项目提供的一种轻量级的表达式语言,它允许我们在Java应用程序中方便地执行...
后缀表达式的计算方法不仅适用于简单的算术表达式,还可以扩展到更复杂的表达式,如函数调用、条件判断等。在编译原理、解释器实现、计算器程序等领域都有广泛的应用。通过理解并掌握后缀表达式及其计算方法,能帮助...
总的来说,Java处理数学表达式的方式多样,`jeval`库提供了一种便捷的解决方案,适用于大部分简单的到中等复杂的计算需求。对于更复杂或定制化的需求,可以考虑使用自定义解析器或Java的`ScriptEngine`。理解并熟练...
6. **Java实现** 在Java中,我们可以使用`Scanner`类读取输入表达式,`Stack<Double>`存储数字,`Stack<Character>`存储操作符。用循环遍历输入,根据字符类型执行相应的操作。 7. **C++实现** 在C++中,可以使用...
Java简易计算器是一个基于Java编程语言实现的计算工具,它不仅支持基本的四则运算,还具备处理三角函数的能力,并且已经实现了运算的优先级规则。这个项目的核心是将用户输入的中缀表达式(常见的数学表达式形式)...
对于Java实现,可以使用`Deque`作为栈,`StringBuilder`作为输出字符串的容器: ```java import java.util.Deque; import java.util.LinkedList; public class InfixToPostfix { public String convert(String ...
在Java多核编程中,Lambda表达式常与Stream API结合使用,实现高效的数据并行处理。 1. **Lambda表达式的基本语法** Lambda表达式的语法形式为`(parameters) -> expression`或`(parameters) -> { statements }`。...
在Java编程语言中实现一个多功能计算器,涉及到许多关键知识点,包括但不限于基础的算术运算、字符串解析、表达式求值、异常处理以及用户界面设计。下面将详细阐述这些知识点。 1. **基础算术运算**:计算器的核心...
这可能涉及正则表达式用于验证输入格式,或者使用字符串分割和栈数据结构来实现一个简单的解析器,处理运算符优先级和括号。 6. **异常处理**:在处理用户输入时,可能出现非法字符、除数为零、超出浮点数范围等...
1. **Java表达式**: Java表达式是程序中的一部分,用于计算一个值。它可以是简单的变量引用、常量,也可以是复杂的运算组合,如算术、比较、逻辑或三元表达式。 2. **表达式语法**: 在Java中,表达式的语法遵循特定...
在这个“精选_表达式计算_源码打包”压缩包中,我们可以预见到包含的文件“calculation”很可能是一个关于表达式计算的源代码实现。 首先,让我们详细探讨一下表达式计算。在编程语言中,表达式是能够计算出特定值...