import java.util.ArrayList; import java.util.List; import java.util.Stack; public class Calculator { /** * @param args */ public static void main(String[] args) throws Exception { List<String>houzhuishi = houzhui("(0.006+(3-1))/(2+1)+3*2"); //List<String>houzhuishi = houzhui("(600+(30000-1))/(2+1)+3*2"); //Double a = Calucate.recursiveCalStr("6+(3-1)/(2+1)+3*2"); System.out.println(calcResult(houzhuishi)); } public static double calcResult(List<String> houzhishi) throws Exception{ Stack<Double> charStack = new Stack<Double>(); for (String str : houzhishi) { if (getHuHao().contains(str)) { Double data1 = charStack.pop(); Double data2 = charStack.pop(); charStack.push(cal(str.charAt(0),data2,data1)); } else { charStack.push(Double.valueOf(str)); } } return charStack.peek(); } public static List<String> getHuHao() { List<String> huhao = new ArrayList<String>(0); huhao.add("+"); huhao.add("-"); huhao.add("*"); huhao.add("/"); huhao.add("("); huhao.add(")"); huhao.add("#"); return huhao; } public static Double cal(char c,double a,double b) throws Exception{ switch(c){ case '+': return a+b; case '-': return a-b; case '*': return a*b; case '/': return a/b; default: throw new Exception("XX"); } } public static List<String> houzhui(String val) { List<String> result = new ArrayList<String>(); Stack<String> charStack = new Stack<String>(); charStack.push("#"); val = val + "#"; int[][] dir = { {1,1,0,0,0,1,1}, {1,1,0,0,0,1,1}, {1,1,1,1,0,1,1}, {1,1,1,1,0,1,1}, {0,0,0,0,0,2,-1}, {1,1,1,1,-1,1,1}, {0,0,0,0,0,-1,2}, }; List<String> test = new ArrayList<String>(); StringBuilder temp = new StringBuilder(); for(int i = 0 ,length = val.length(); i < length ; i++) { String chr = String.valueOf(val.charAt(i)); if (getHuHao().contains(chr) ) { if (temp.length() > 0) { test.add(temp.toString()); } test.add(chr); temp.delete(0, temp.length()); } else { temp.append(chr); } } for (int i = 0 ,size = test.size(); i < size ; i++) { String str = test.get(i); try { Double.valueOf(str); result.add(str); } catch (NumberFormatException e) { int x = getHuHao().indexOf(str); int y = getHuHao().indexOf(charStack.peek()); if (dir[y][x] == 0) { charStack.push(str); } else if (dir[y][x] == 1) { result.add(charStack.pop()); i --; } else if (dir[y][x] == 2 && (x == 5 && y == 4 )) { charStack.pop(); } else if (dir[y][x] == 2 && (x == 6 && y == 6 )) { break; } else { break; } } } return result; } }
附件中有算法解释。
相关推荐
本程序使用栈实现了加减乘除三角函数和括号的混合运算,由于本人比较懒,没有写界面且三角函数只实现了tan运算,相信聪明的你会做的更好
将近250行的算法 实现了通过字符串进行加减乘除四则运算 纯通过处理字符串和数组实现 希望能帮助大家: 例如:String input "33+26 77+70"; String result ""; try { result Account...
FPGA实现计算器(四位以内加减乘除,逻辑运算,包含优先级)
用java语言实现的一个简单计算器,支持加减乘除,小数,带括号运算,不支持负数,该程序带有界面,附带使用方法,算法实现简单,可能有一些小bug未解决,主要是测试有限。。
实现了 有理数(可以负数,可以小数点)之间的加减法(允许包含括号的加减乘除) 允许负数带括号 利用BigDecimal 大数据类 来保证精度 例如Double 2-1.1=0.89999,在大数据类就无异常 例如 9+(-9)=0 9--6=15 9*...
用labview编写的计算器 与别人的计算器只注重界面不同 该计算器主要注重算法 当你输入一个加减乘除的公式时(暂不支持括号) 会求出运算结果
C#编写的计算器程序(源码),编译环境VS2010。运用了字符串分割和匹配的算法,可以实现无限长度计算式的计算,效率高,包括加减乘除括号乘方运算,清测可用。并且制作界面简洁,不逊色于系统自带计算器
Java 制作实现的UI可视化界面版数学计算器源代码,另附编程文档,本计算器可以进行常用的加减乘除算术运算。本实例的知识点有:窗口布局器GridLayout的应用,对按钮消息的监听和响应 。运行方法:本实例代码编写完毕...
使用 JavaScript 写的网页版计算器。可以很好的完成加减乘除,但是并没有括号提供使用。内部实现的话,主要基于入栈出栈,与大学算法书中的简易计算器原理一致。
5、利用re.split()、re.findall()方法,通过加减符号,对四则运算进行拆分为乘除运算式和数字,并保留对应的位置下标。 6、利用re.split()、re.findall()方法,通过乘除符号,将乘除式拆分为乘除符号与数字,...
使用C++模拟了计算器的四则运算,包括加减乘除以及括号优先级运算,主要解决办法是将键盘输入的四则运算表达式转为逆波兰表达式,然后再进一步计算逆波兰表达式的值,具体算法思路在主页,资源包括一个main.cpp文件...
数据结构相关,使用了栈来辅助转换 一、利用表达式原转后缀、后缀求值算法编写计算器程序。...表达式中有加减乘除运算符、括号,操作数限定为个位数。 二、将个位数计算器程序扩展成为浮点数计算机程序。
练习java弄出的一个简易计算器,能实现简单的加减乘除操作,有加括号功能,因为java的JFrame默认页面很丑,所以在linux上面看起来比较丑,win上面看起来还行,实现计算的操作是将中缀表达式转后缀表达式并且采用数据...