需求:输入字符串表达式,计算表达式结果
解决:将输入的表示转化为后缀表达式形式(也称作逆波兰式),再计算结果。
package com.phh;
import java.util.Stack;
public class CalculatedString {
/**
* 根据中缀表达式计算结果
*
* @param expression
* @return
*/
public Float calculate(String expression) {
Float result = null;
Stack stack = new Stack();
char[] exp = expression.toCharArray();
StringBuffer s = new StringBuffer();
for (char c : exp) {
if (c == 32) {
if (!s.toString().equals("")) {
stack.push(Float.valueOf(s.toString()));
s = new StringBuffer();
}
}
if (c >= 48 && c <= 57) {
s.append(c);
}
if (c == 42 || c == 43 || c == 45 || c == 47) {
if (!s.toString().equals("")) {
stack.push(Float.valueOf(s.toString()));
s = new StringBuffer();
}
}
if (c == 42) {
float b = (Float) stack.pop();
float a = (Float) stack.pop();
stack.push(a * b);
}
if (c == 43) {
float b = (Float) stack.pop();
float a = (Float) stack.pop();
stack.push(a + b);
}
if (c == 45) {
float b = (Float) stack.pop();
float a = (Float) stack.pop();
stack.push(a - b);
}
if (c == 47) {
float b = (Float) stack.pop();
float a = (Float) stack.pop();
stack.push(a / b);
}
}
result = (Float) stack.pop();
return result;
}
public static void main(String[] args) {
MiddleToLast m = new MiddleToLast();
CalculatedString cal = new CalculatedString();
String expression = m.transfer("15+18-2*10+(9-6+2)/2+18");
System.out.println(cal.calculate(expression));
}
}
package com.phh;
import java.util.Stack;
public class MiddleToLast {
/**
* 将输入的中缀表达式转化为后缀表达式
*
* @param 中缀表达式
* @return 后缀表达式
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public String transfer(String middle) {
StringBuffer last = new StringBuffer();
Stack stack = new Stack();
int level = 0;
char middleChar[] = middle.toCharArray();
for (char c : middleChar) {
if (c >= 48 && c <= 57) {
last.append(c);
}
if (c == 40) {
stack.push(c);
}
if (c == 43 || c == 45) {
if (level > 1) {
while (!stack.isEmpty()
&& 40 != (Character) stack.firstElement()) {
char c1 = (Character) stack.pop();
if (c1 != 40) {
last.append(c1);
}
}
}
stack.push(c);
last.append(" ");
level = 1;
}
if (c == 42 || c == 47) {
stack.push(c);
level = 2;
last.append(" ");
}
if (c == 41) {
while (!stack.isEmpty()) {
char c1 = (Character) stack.pop();
if (c1 != 40) {
last.append(c1);
} else {
break;
}
}
}
}
while (!stack.isEmpty()) {
char c1 = (Character) stack.firstElement();
if (c1 != 40) {
last.append(stack.pop());
}
}
return last.toString();
}
public static void main(String[] args) {
MiddleToLast m = new MiddleToLast();
String middle = "9+(3-1)*3+10/2";
System.out.println(m.transfer(middle));
}
}