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

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;
	}
}

 附件中有算法解释

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会为你解答关于编译原理课程设计的问题。首先,让我们来了解下编译原理的基本概念。 编译原理是指翻译高级语言程序的一门学科,它主要研究如何将高级语言程序翻译成机器语言程序。编译原理的主要任务是设计和实现编译器。 针对你的问题,我们来分步骤地回答: 第一步:环境部署 首先,我们需要安装一些必要的工具,例如编译器、文本编辑器等。在这里,我们可以选择使用C++语言来实现计算器,因为C++语言是一种高效、灵活的编程语言,可以很好地满足我们的需求。 在安装好必要的工具之后,我们需要编写一些基本的代码,例如定义数据类型、变量、函数等。 第二步:需求分析 在这个阶段,我们需要明确计算器的功能和要求,例如支持加减乘除括号,能够处理整数和浮点数等。 我们还需要确定计算器的界面设计和交互方式,例如通过命令行界面或者图形界面来输入和输出计算结果。 第三步:总体设计 在这个阶段,我们需要根据需求分析的结果,设计计算器的总体结构和算法,例如如何处理加减乘除括号等运算符,如何处理整数和浮点数等数据类型。 我们还需要考虑如何进行错误处理,例如输入非法字符或者除数为0等错误情况。 第四步:详细设计与实现 在这个阶段,我们需要根据总体设计的结果,进行详细的代码设计和实现。具体来说,我们可以采用词法分析、语法分析和语义分析等技术来实现计算器的编译器。 词法分析可以将输入的字符串分解成符号序列,例如将“2+3*4”分解成“2”、“+”、“3”、“*”、“4”等符号。 语法分析可以根据语法规则构建语法树,例如将“2+3*4”构建成一个二叉树,其中根节点为“+”,左子树为“2”,右子树为“3*4”。 语义分析可以对语法树进行计算,例如对“2+3*4”的语法树进行计算得到14。 最后,我们需要对代码进行测试和调试,确保计算器能够正确地处理各种输入情况,并且能够输出正确的计算结果。 以上就是编译原理课程设计一个简单的计算器的基本流程,希望能够对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值