黑马程序员技术交流社区
标题:
求大神帮助,关于混合运算式运算的问题
[打印本页]
作者:
刘松703
时间:
2013-12-19 12:35
标题:
求大神帮助,关于混合运算式运算的问题
我想问一下怎样实现%,开根号等这种运算符运算啊,我是传入str字符串,str就是混合运算公式,我是运用栈实现运算的,可是如果综合式子里出现%,开根号什么的我就不太清楚符号和数字该怎样出栈才会正确了,求帮助!例如str=“1+(√4*(3/1+2))=”
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;
}
}
复制代码
作者:
黄伟财
时间:
2013-12-20 20:18
老见你回复,想不到你也有问题解决不了的
作者:
刘松703
时间:
2013-12-20 22:42
黄伟财 发表于 2013-12-20 20:18
老见你回复,想不到你也有问题解决不了的
都是人啊哈哈哪能没有问题的我也是菜鸟啊
作者:
黄伟财
时间:
2013-12-21 00:04
刘松703 发表于 2013-12-20 22:42
都是人啊哈哈哪能没有问题的我也是菜鸟啊
不是吧,看你样子觉得挺牛的
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2