闲着没事写了个基于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写的数学表达式计算程序,报告内含代码,能直接运行。
实现了算术表达式计算的解析,可计算含有括号(),加减乘除+-*/运算
java简易计算器,能够进行四则运算、三角函数运算,已实现优先级。 将中缀表达式转化成后缀表达式(逆波兰表达式) 主要运用了栈、简单的数学知识,java图形界面设计等相关知识
用Java实现的简易计算器 Java课程作业 ;三个JTextField显示的分别是:储存的数,计算表达式,计算结果;计算顺序:不论优先级,一律按照从左到右的顺序计算,跟Windows自带的计算器一样;清除键:清除表达式和计算...
java计算器代码简单的计算器java计算器代码实现简单计算
Fel的执行主要是通过函数实现,运算符(+、-等都是Fel函数),所有这些函数都是可以替换的,扩展函数也非常简单。 Fel有双引擎,同时支持解释执行和编译执行。可以根据性能要求选择执行方式。编译执行就是将表达式...
利用JavaSwing实现简单的计算器,输入计算表达式得出结果,支持左右括号,负数以及小数。简单处理表达式不正确的情况,并且负数需打上括号。
此文档中的代码实现了简单的计算中缀表达式的求值方法,通过把中缀表达式转换为后缀表达式,可以很方便的进行求值。
掌握Java语言的特点,实现机制和体系结构。 2. 掌握Java语言中面向对象的特性。 3. 掌握Java语言提供的数据类型和结构。 4. 掌握Java语言编程的基本技术。 5. 会编写Java用户界面程序。 6. 会编写Java简单应用程序...
jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...
何其他内建正则表达式支持的语言,你一定知道用正则表达式处理文本和匹配模式是多么简单。如果你不熟悉这个术语,那么“正则表达式”(Regular Expression)就是一个字符构成的串,它定义了一个用来搜索匹配字符串的...
主要思想:1)将中缀表达式转化为后缀表达式 2):根据后缀表达式计算表达式结果 数据结构:堆栈(使用JAVA中util包中Stack类) 列表(使用JAVA中util包中ArrayList类) 界面良好,代码完整可直接运行,文档很好哦!
leapYearByLogical.java 用逻辑表达式判断闰年 lowToUpper.java 小写字母转换成大写字母 lozengeStar.java 输出一个由*组成的菱形 multiplyTable.java 求乘法口诀表 narrowingConversion_1.java 缩减转换引发...
百度云盘分享 ... Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。 部分源代码摘录: ftpClient = new FtpClient(); //实例化FtpClient对象 String serverAddr=jtfServer.getText();...
Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。 部分源代码摘录: ftpClient = new FtpClient(); //实例化FtpClient对象 String serverAddr=jtfServer.getText(); //得到服务器地址 ...
JAVA正则表达式语法(转)正则表达式语法正则表达式是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”)。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式示例表达式 ...
jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...
jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...
jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...