`
bo_hai
  • 浏览: 565867 次
  • 性别: 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#计算器混合运算(加减乘除括号)

    在C#编程中,创建一个支持混合运算的计算器是一项常见的任务,这涉及到处理加法、减法、乘法、除法以及括号内的运算。在这个项目中,开发者使用了栈数据结构来解决这个问题。栈是一种后进先出(LIFO)的数据结构,...

    计算器运算逻辑实现(带括号,求余,乘方,加减乘除),不使用eval函数-前端JavaScript 源码实现-括号匹配与初等运算

    在前端开发中,实现一个计算器功能是一项常见的任务,特别是当这个计算器需要处理复杂的运算,如括号、求余、乘方以及加减乘除时。本文将深入探讨如何使用JavaScript来实现这样的计算器逻辑,不依赖于`eval`函数,...

    一个可以实现括号、加减乘除优先级运算的计算器

    在编程领域,构建一个可以处理括号和加减乘除优先级运算的计算器是一项常见的练习。这个"一个可以实现括号、加减乘除优先级运算的计算器"项目旨在为安卓新手提供一个学习平台,让他们了解如何处理复杂的数学表达式。...

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

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

    计算器,加减乘除

    本项目以C语言和C++为编程工具,在Visual Studio 2010环境下实现了一个基本的计算器,支持加、减、乘、除运算,并考虑了括号的优先级问题。 C语言和C++都是广泛使用的编程语言,C语言以其简洁高效著称,而C++则在其...

    C++编写一个计算器,实现加减乘除,并且实现简单的混合运算(不包括括号运算)

    在计算过程中,首先处理乘法和除法,因为根据数学运算规则,乘除的优先级高于加减。程序通过遍历操作符数组,检查每个操作符是否为乘法或除法,如果是,则根据前一个操作符的类型(加或减)调整当前操作数,并将当前...

    计算器(加减乘除基本运算-带括号)

    我们需要编写各种测试用例,覆盖不同的运算情况,包括但不限于简单加减乘除、带有括号的复杂表达式、错误的表达式等。测试用例的设计应涵盖边界条件,如最大数字限制、除零错误等,以确保计算器在遇到这些情况时能给...

    用C++语言编写的基于MFC的计算器程序 实现了基本的加减乘除及括号功能 用户可以按照需要选择进制,有二进制,八进制,十进制和十六进制等四种进制方式

    接下来,我们关注计算器的核心功能——加减乘除及括号运算。实现这些功能需要理解和运用操作数栈(也称为计算堆栈)。当用户输入数字和运算符时,程序会将数字压入栈中,遇到运算符则进行相应的运算,根据运算优先级...

    C#简易计算器(加减乘除运算)

    C#支持多种运算符,包括算术运算符如`+`(加)、`-`(减)、`*`(乘)、`/`(除)。在我们的计算器中,这些运算符将被用于执行用户输入的计算。 3. **控制流** 我们需要使用条件语句(如`if`)来判断除数是否为零...

    小型计算器可以进行加减乘除运算,可以连续进行计算!

    - 如果输入的字符 `y` 不是合法的运算符(加、减、乘、除、幂),或者输入状态异常,则提示用户重新输入。 #### 计算逻辑 - 计算部分采用了迭代的方式,对运算符链表进行遍历,当遇到乘法、除法或幂运算时,就立即...

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

    2. **加减乘除运算**:在FPGA中实现加减乘除是通过硬件描述语言(如VHDL或Verilog)进行编程。这通常涉及到多位加法器、减法器、乘法器和除法器的设计,对于四位数,需要处理进位和借位等细节。 3. **逻辑运算**:...

    LCD1602液晶显示的计算器(加减乘除)

    对于加减乘除运算,我们可以使用嵌套的if-else语句或switch-case结构。例如,加法和减法相对简单,可以直接对两个操作数进行运算。乘法和除法则需要额外的循环或递归处理。同时,我们还需要处理溢出和除零的情况,...

    加减乘除四则混合运算计算器-java

    在本项目中,我们主要探讨的是如何利用Java编程语言设计一个具有加减乘除四则混合运算功能的GUI(图形用户界面)计算器。这个计算器旨在模拟Windows操作系统中的标准计算器,提供用户友好的交互方式,使得非程序员也...

    原生js简单的加减乘除计算器样式代码

    在JavaScript(JS)中创建一个简单的加减乘除计算器是一个基础但实用的实践项目,它可以帮助初学者理解事件处理、DOM操作以及基本的数学运算。本项目主要涉及到以下几个知识点: 1. **HTML 结构**:首先,我们需要...

    我做的多则运算支持括号加减乘除

    标题中的“我做的多则运算支持括号加减乘除”指的是一个计算器程序,它能够处理包含括号的数学表达式,并执行基本的四则运算(加法、减法、乘法和除法)。这个计算器是由Java编程语言实现的,显示了开发者在编程和...

    简易的android计算器

    加减乘除的运算可以通过Java内置的算术运算符完成。清除操作则需要重置这些变量,以便开始新的计算。在等号键被点击后,程序会根据当前的数值和操作符执行计算,并将结果显示在显示屏上。 为了提高用户体验,还需...

    数据结构的计算器算法之C++

    2. **运算符优先级**:根据运算符的优先级规则,如乘除优先于加减,括号内的运算优先于括号外。我们可以使用栈来存储运算符,遇到高优先级的运算符时,将其压入栈中;遇到低优先级的运算符或数字时,就从栈顶弹出...

    两个数的加减乘除计算器

    本项目名为“两个数的加减乘除计算器”,其核心功能是处理两个数的四种基本运算:加法、减法、乘法和除法。在此基础上,描述中提出了扩展需求,即增加对三个数的加减乘除运算支持。 首先,我们来讨论如何实现基础的...

Global site tag (gtag.js) - Google Analytics