- package com.song.computer.calculate;
- import java.util.LinkedList;
- import java.util.List;
- /**
- * 刘松 calculate.java
- *
- * @author song 功能:1.实现加减乘除的方法 2.运算符的优先级比较
- *
- */
- public class Calculate {
- private static int nowSyst = 10;// 表示使用的进制形式
- private List<String> numbers = new LinkedList<String>();
- private List<String> opers = new LinkedList<String>();
- public Calculate() {
- }
- // 处理字符计算方法
- private String calculateNumbers(String str) throws Exception {
- int i = 0;
- String r = "";
- String num = "";
- while (i < str.length()) {
- String s = String.valueOf(str.charAt(i));
- if (s.equals("(")) {
- processOper(s, num);
- } else if (s.equals(")")) {
- processOper(s, num);
- num = "";
- } else if (s.equals("*")) {
- processOper(s, num);
- num = "";
- } else if (s.equals("/")) {
- processOper(s, num);
- num = "";
- } else if (s.equals("+")) {
- processOper(s, num);
- num = "";
- } else if (s.equals("-")) {
- processOper(s, num);
- num = "";
- } else if (s.equals("%")) {
- } else if (s.equals("^")) {
- } else if (s.equals("√")) {
- } else if (s.equals("=")) {
- processOper(s, num);
- r = numbers.remove(numbers.size() - 1);
- num = "";
- } else {
- num += s;
- }
- i++;
- }
- return r;
- }
- // 得到运算符后的处理方法
- /**
- * @param op 运算符
- * @param num 数值
- * @throws Exception 抛出无法计算的异常
- */
- private void processOper(String op, String num) throws Exception {
- if (num != "") {
- if (nowSyst != 10) {
- num = changeSystem(nowSyst, 10, num);
- }
- numbers.add(num);
- }
- if (opers.isEmpty()) {
- opers.add(op);
- } else {
- String chr = opers.get(opers.size() - 1);
- //如果当前符号的优先级小于容器里最后一个符号的优先级,则进行运算否则把否号放入容器
- while (!getPriority(op, chr)) {
- if (")".equals(op) && "(".equals(chr)) {
- opers.remove(opers.size() - 1);
- break;
- }
- double m = Double.valueOf(numbers.remove(numbers.size() - 1));
- double n = Double.valueOf(numbers.remove(numbers.size() - 1));
- CalculateAction cal = new CalculateAction();
- double sum = cal.resultSum(n, m, chr);
- opers.remove(opers.size() - 1);
- numbers.add(String.valueOf(sum));
- if (opers.isEmpty()) {
- break;
- }
- chr = opers.get(opers.size() - 1);
- }
- if (!"=".equals(op) && !")".equals(op)) {
- opers.add(op);
- }
- }
- }
- // 优先级比较
- /**
- * @param op1 运算符1
- * @param op2 运算符2
- * @return 返还优先级的比较结果,boolean值
- */
- private boolean getPriority(String op1, String op2) {
- if (!")".equals(op1) && "(".equals(op2)) {
- return true;
- } else if ("(".equals(op1) && !"(".equals(op2)) {
- return true;
- } else if (("*".equals(op1) || "/".equals(op1)) && !"(".equals(op2)
- && !"*".equals(op2) && !"/".equals(op2)) {
- return true;
- } else if (("+".equals(op1) || "-".equals(op1))
- && ("=".equals(op2) || ")".equals(op2))) {
- return true;
- } else if (")".equals(op1) && "=".equals(op2)) {
- return true;
- } else if ("=".equals(op1) && op2 == null) {
- return true;
- }
- return false;
- }
- // 进制转换
- /**
- *
- * @param s1
- * 数值的当前进制
- * @param s2想要转换成的进制
- * @param num
- * 要转换进制的数值
- * @return 返回转换后的数值
- */
- public String changeSystem(int s1, int s2, String num) {
- if (num.indexOf(".") == -1) { // 数值中没有小数时
- int part = Integer.valueOf(num, s1);
- return Integer.toString(part, s2);
- } else {
- String[] nums = num.split("\\.");// 有小数时
- int intPart = 0;
- int decPart = 0;
- intPart = Integer.valueOf(nums[0], s1);
- decPart = Integer.valueOf(nums[1], s1);
- String qstr = Integer.toString(intPart, s2);
- String hstr = Integer.toString(decPart, s2);
- return qstr + "." + hstr;
- }
- }
- /**
- *
- * @param str
- * 计算式的字符串
- * @return 返还计算后的结果
- * @throws Exception
- * 抛出无法计算式的异常
- */
- public String getResult(String str) throws Exception {
- String r;
- r = calculateNumbers(str);
- if (nowSyst != 10) {
- r = changeSystem(10, nowSyst, r);
- }
- return r==""? "0":r;
- }
- // 得到进制形式
- public void setSyst(int syst) {
- nowSyst = syst;
- }
- // 返回进制形式
- public int getSyst() {
- return nowSyst;
- }
- }
复制代码
我想问一下怎样实现%,开根号等这种运算符运算啊,我是传入str字符串,str就是混合运算公式,我是运用栈实现运算的,可是如果综合式子里出现%,开根号什么的我就不太清楚符号和数字该怎样出栈才会正确了,求帮助!例如str=“1+(√4*(3/1+2))=” |