`
bo_hai
  • 浏览: 554202 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

计算器算法(支持加减乘除括号)

 
阅读更多
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;
	}
}

 附件中有算法解释

3
4
分享到:
评论

相关推荐

    c#计算器混合运算(加减乘除括号)

    本程序使用栈实现了加减乘除三角函数和括号的混合运算,由于本人比较懒,没有写界面且三角函数只实现了tan运算,相信聪明的你会做的更好

    输入字符串实现加减乘除四则运算(java)

    将近250行的算法 实现了通过字符串进行加减乘除四则运算 纯通过处理字符串和数组实现 希望能帮助大家: 例如:String input &quot;33+26 77+70&quot;; String result &quot;&quot;; try { result Account...

    final3.rar_FPGA 加减乘除_fpga计算器_优先级计算器_计算器FPGA_逻辑计算器

    FPGA实现计算器(四位以内加减乘除,逻辑运算,包含优先级)

    java实现的一个简单计算器

    用java语言实现的一个简单计算器,支持加减乘除,小数,带括号运算,不支持负数,该程序带有界面,附带使用方法,算法实现简单,可能有一些小bug未解决,主要是测试有限。。

    使用JavaFX实现的中缀转后缀 计算器(可以负数小数点括号)期末作业满分答案,大量注释(行行注释保证看懂)

    实现了 有理数(可以负数,可以小数点)之间的加减法(允许包含括号的加减乘除) 允许负数带括号 利用BigDecimal 大数据类 来保证精度 例如Double 2-1.1=0.89999,在大数据类就无异常 例如 9+(-9)=0 9--6=15 9*...

    labview计算器(算法类)

    用labview编写的计算器 与别人的计算器只注重界面不同 该计算器主要注重算法 当你输入一个加减乘除的公式时(暂不支持括号) 会求出运算结果

    C#计算器程序

    C#编写的计算器程序(源码),编译环境VS2010。运用了字符串分割和匹配的算法,可以实现无限长度计算式的计算,效率高,包括加减乘除括号乘方运算,清测可用。并且制作界面简洁,不逊色于系统自带计算器

    Java 可视化界面版计算器程序 文档.rar

    Java 制作实现的UI可视化界面版数学计算器源代码,另附编程文档,本计算器可以进行常用的加减乘除算术运算。本实例的知识点有:窗口布局器GridLayout的应用,对按钮消息的监听和响应 。运行方法:本实例代码编写完毕...

    JavaScript网页计算器-栈实现.html

    使用 JavaScript 写的网页版计算器。可以很好的完成加减乘除,但是并没有括号提供使用。内部实现的话,主要基于入栈出栈,与大学算法书中的简易计算器原理一致。

    Python利用正则表达式实现计算器算法思路解析

     5、利用re.split()、re.findall()方法,通过加减符号,对四则运算进行拆分为乘除运算式和数字,并保留对应的位置下标。  6、利用re.split()、re.findall()方法,通过乘除符号,将乘除式拆分为乘除符号与数字,...

    C++使用逆波兰表达式实现计算器四则运算(完整代码)

    使用C++模拟了计算器的四则运算,包括加减乘除以及括号优先级运算,主要解决办法是将键盘输入的四则运算表达式转为逆波兰表达式,然后再进一步计算逆波兰表达式的值,具体算法思路在主页,资源包括一个main.cpp文件...

    C语言实现表达式的转换为后缀表达式,并计算后缀表达式的值

    数据结构相关,使用了栈来辅助转换 一、利用表达式原转后缀、后缀求值算法编写计算器程序。...表达式中有加减乘除运算符、括号,操作数限定为个位数。 二、将个位数计算器程序扩展成为浮点数计算机程序。

    javaPratice_Calculator_Simple_Easy

    练习java弄出的一个简易计算器,能实现简单的加减乘除操作,有加括号功能,因为java的JFrame默认页面很丑,所以在linux上面看起来比较丑,win上面看起来还行,实现计算的操作是将中缀表达式转后缀表达式并且采用数据...

Global site tag (gtag.js) - Google Analytics