当前位置:首页 > IT技术

科学计算器的实现(java语言)

时间:2019-10-28 10:12:16来源:IT技术作者:seo实验室小编阅读:58次「手机版」
 

科学计算器使用

实现科学计算器:

就要想它的算法,这里应用的是经典的后缀表达式的应用。

后缀表达式:

一种不需要括号的后缀表达法,

如:1+2*3*(1+2)+(3-2)*(5/2) 为中缀表达法;

它所对应的后缀表达式为:123*12+*+32-52/*+ 

中缀表达式转后缀表达式:

可以用栈进行入算术符进行转换,

然后进行优先级的判断,进行出入栈的操作;

后缀表达式计算结果:

遍历后缀表达式,遇到数字进行入栈,遇到符号弹出2个数进行计算,再次入栈。

面试java的实现代码

import java.util.ArrayList;
import java.util.List;
import java.util.scanner;
import java.util.Stack;
/**
 * 科学表达式: 总的计算思路为:
 1.将中缀表达式转化为后缀表达式(栈是用来进出运算的符号)
 2.将后缀表达式进行运算得出结果(栈是用来进出运算的数字)
 * 
 * @author chennan
 *
 */
public class Calculate {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		System.out.println("请输入一个包含加减乘除的表达式:");
		String s=sc.nextLine();
		System.out.println(s+"="+calculate(s));
	}

	public static double calculate(String expre) {
		List<String> num=transformEnd(expre);
		Stack<Double> stack = new Stack<>();
		double sum = 0;
		while (!num.isempty()) {
			String temp = String.valueOf(num.remove(0));
			if (isNamber(temp)) {
				double s=Double.parseDouble(temp);
				stack.push(s);
			} else {
				double a=stack.pop();
				double b=stack.pop();
				double c=calTwo(b,a,temp);
				stack.push(c);
			
			}
		}
		sum=stack.pop();
		return sum;
	}

	private static double calTwo(double a, double b, String opr) {
		double sum = 0;
		switch (opr) {
		case "+":
			sum = a + b;
			break;
		case "-":
			sum = a - b;
			break;
		case "*":
			sum = a * b;
			break;
		case "/":
			sum = a / b;
			break;
		}
		return sum;
	}

	/**
	 * 
	 * 1.将中缀表达式转化为后缀表达式(栈是用来进出运算的符号)
	 */
	public static List<String> transformEnd(String expre) {
		List<String> sb = new ArrayList<>();
		Stack<String> stack = new Stack<>();
		expre = expre.replaceAll("(\\D)", "o$1o");
		String[] esp = expre.trim().split("o");

		for (int i = 0; i < esp.length; i++) {
			String s = esp[i].trim();

			if (isNamber(s)) {
				// 如果是数字则输出
				sb.add(s);
			} else if (!s.isEmpty()) {

				if (s.charAt(0) == ')') {
					while (stack.peek().charAt(0) != '(') {
						sb.add(stack.pop());
					}
					stack.pop();
				} else {
					if (!stack.isEmpty() && !isMaxExp(s.charAt(0), stack.peek().charAt(0))) {
						while (!stack.isEmpty() && !isMaxExp(s.charAt(0), stack.peek().charAt(0))) {
							sb.add(stack.pop());
						}
						stack.push(s);
					} else {
						stack.push(s);
					}
				}
			}
		}
		while (!stack.isEmpty()) {
			sb.add(stack.pop());
		}
		return sb;
	}

	// 判断是否是数字
	private static boolean isNamber(String str) {
		try {
			Double.parseDouble(str);

		} catch (runtimeexception e) {
			return false;
		}
		;
		return true;
	}

	// 判断是否进栈
	private static boolean isMaxExp(char exp1, char exp2) {
		if (exp1 == '(')
			return true;
		if (exp2 == ')')
			return true;
		if (transExp(exp1) > transExp(exp2))
			return true;

		return false;

	}

	private static int transExp(char exp) {
		int re = 0;
		switch (exp) {
		case '*':
		case '/':
			re = 2;
			break;
		case '+':
		case '-':
			re = 1;
			break;
		}
		return re;
	}

}

文章最后发布于: 2018-09-13 17:08:21

相关阅读

C语言实现打飞机

#include<stdio.h> #include<stdlib.h> #include<windows.h> #include<time.h> #define U 1 #define D 2 #define L 3 #d

非常值得一看—九种滤波算法C语言实现

关注“嵌入式软件开发学习圈”免费获取更多学习教程今天带着大家学习滤波算法c语言(九种滤波算法)实现,以及代码,大家可以学习了解下

Java NIO服务器:远程主机强迫关闭了一个现有的连接

Java NIO聊天室 中,若客户端强制关闭,服务器会报“java.io.IOException: 远程主机强迫关闭了一个现有的连接。”,并且服务器会在报错

QT实现自动关机

当今的非标设备,对于客户来说,使用越简单越方便越好,有时候客户不想通过手工去关工控机,只要PLC端关闭后,工控机也自动关闭,这在QT中很

分享一个自己做的截图小工具(基于Windows平台的批处理

最近项目中要有截图的工作要做,对于我等使用AS的开发人员来说,视频或者截图借用工具也是分分钟的事情,但是公司的业务同事和测试人员

分享到:

栏目导航

推荐阅读

热门阅读