62,614
社区成员
发帖
与我相关
我的任务
分享
import java.util.*;
public class CaculateStr {
private static String[] s = { "+", "-", "*", "/" };
// +,-,*,/的优先级比对表
private static String[][] tabel = { { "<", "<", ">", ">" },
{ "<", "<", ">", ">" }, { "<", "<", "<", "<" },
{ "<", "<", "<", "<" } };
public static String compareLevel(String a, String b) {
int row = 0;
int col = 0;
for (int i = 0; i < 4; i++)
if (s[i].equals(a))
col = i;
for (int i = 0; i < 4; i++)
if (s[i].equals(b))
row = i;
return tabel[row][col];
}
public static float caculate(String s) {
try {
boolean flag = false;// 起标识作用,决定该不该取出numbers众的数字入num_stack栈
StringTokenizer st = new StringTokenizer(s, "+-*/");
// 存放所有的参与运算的数字
List<Float> numbers = new ArrayList<Float>();
// 存放所有的运算符
List<String> symbols = new ArrayList<String>();
// 数字栈
Stack<Float> num_stack = new Stack<Float>();
// 运算符栈
Stack<String> sym_stack = new Stack<String>();
// 逐个把参与运算的数字存储到numbers里面
while (st.hasMoreTokens()) {
numbers.add(Float.parseFloat(st.nextToken()));
}
// 逐个把运算符存储到symbols里面
for (int i = 0; i < s.length(); i++) {
String temp = s.substring(i, i + 1);
if (temp.equals("+") || temp.equals("-") || temp.equals("*")
|| temp.equals("/")) {
symbols.add(temp);
}
}
// 满足一下条件之一继续执行
// 符号栈没有空、数字栈栈内元素多于一个、numbers没有空、symbols没有空
while (sym_stack.isEmpty() == false || num_stack.size() > 1
|| numbers.isEmpty() == false || symbols.isEmpty() == false) {
// flag为false从numbers中取第一个数字 入num_stack栈
if (flag == false) {
num_stack.add(numbers.get(0));
numbers.remove(0);
}
// 如果符号栈为空,从symbols中取第一个运算符如入sym_stack栈
// 并从numbers中取第一个数字 入num_stack栈
if (sym_stack.isEmpty()) {
sym_stack.add(symbols.get(0));
symbols.remove(0);
num_stack.add(numbers.get(0));
numbers.remove(0);
}
// 运算符用完 或者
// 后面一个运算符优先级小于运算符栈顶元素的优先级,如:“-”的优先级小于“*”
// 取出数字栈栈顶两个数进行运算
if (symbols.isEmpty()
|| compareLevel(symbols.get(0),
sym_stack.get(sym_stack.size() - 1))
.equals("<")) {
flag = true;
Float a = num_stack.get(num_stack.size() - 1);
num_stack.remove(num_stack.size() - 1);
Float b = num_stack.get(num_stack.size() - 1);
num_stack.remove(num_stack.size() - 1);
String sym = sym_stack.get(sym_stack.size() - 1);
sym_stack.remove(sym_stack.size() - 1);
if (sym.equals("+")) {
num_stack.add(b + a);
} else if (sym.equals("-")) {
num_stack.add(b - a);
} else if (sym.equals("*")) {
num_stack.add(b * a);
} else if (sym.equals("/")) {
num_stack.add(b / a);
}
} else {// 从symbols中取第一个运算符入sym_stack栈
flag = false;
sym_stack.add(symbols.get(0));
symbols.remove(0);
}
}
return num_stack.get(num_stack.size() - 1);
} catch (Exception e) {
System.out.println("检查输入字符串是否符合算术表达式标准!");
e.printStackTrace();
return 0f;
}
}
public static void main(String[] args) {
String s = "3*2+8/2*5/5+7-8";
System.out.println(s + "=" + caculate(s));
}
}//用堆栈做的
//简单模拟实现
import java.util.Arrays;
import java.util.Stack;
public class CalcExpress {
public static void main(String[] args) {
String calcString = "12+26*3/6-39+9*32";
String[] nArray = calcString.split("[^0-9]");
String[] oArray = calcString.split("[^\\+\\-\\*\\/]{1,}");
System.out.println("Nums:\t\t\t\t\t" + Arrays.toString(nArray));
System.out.println("Opts:\t\t\t\t\t" + Arrays.toString(oArray));
Stack<String> stack = new Stack<String>();
for(int i=0; i<nArray.length;) {
stack.push(nArray[i++]);
if(i < oArray.length) stack.push(oArray[i]);
}
System.out.println("DataInStack:\t\t\t\t" + stack);
Stack<String> tempStack = new Stack<String>();
calcPlusDivide(stack, tempStack);
calcAddDec(tempStack);
System.out.println("FinalResult:\t\t\t\t" + tempStack);
}
public static void calcAddDec(Stack<String> stack) {
if(!stack.isEmpty()) {
System.out.println("AddOrDec:\t\t\t\t" + stack);
String tempStr = stack.pop();
if(!stack.isEmpty()) {
String opt = stack.pop();
Double result = "+".equals(opt) ? Double.valueOf(tempStr) + Double.valueOf(stack.pop()) : Double.valueOf(tempStr) - Double.valueOf(stack.pop());
stack.push(String.valueOf(result));
calcAddDec(stack);
}else {
stack.push(tempStr);
}
}
}
public static void calcPlusDivide(Stack<String> stack, Stack<String> tempStack) {
if(!stack.isEmpty()) {
System.out.println("PlusOrDiv:\t\t\t\t" + stack + "\t\t\t\t" + tempStack);
String tempStr = stack.pop();
if("*".equals(tempStr) || "/".equals(tempStr)) {
String strA = stack.pop();
String strB = tempStack.pop();
Double result = "*".equals(tempStr) ? Double.valueOf(strA) * Double.valueOf(strB) : Double.valueOf(strA) / Double.valueOf(strB);
tempStack.push(String.valueOf(result));
}else {
tempStack.push(tempStr);
}
calcPlusDivide(stack, tempStack);
}
}
}
/*
Nums: [12, 26, 3, 6, 39, 9, 32]
Opts: [, +, *, /, -, +, *]
DataInStack: [12, +, 26, *, 3, /, 6, -, 39, +, 9, *, 32]
PlusOrDiv: [12, +, 26, *, 3, /, 6, -, 39, +, 9, *, 32] []
PlusOrDiv: [12, +, 26, *, 3, /, 6, -, 39, +, 9, *] [32]
PlusOrDiv: [12, +, 26, *, 3, /, 6, -, 39, +] [288.0]
PlusOrDiv: [12, +, 26, *, 3, /, 6, -, 39] [288.0, +]
PlusOrDiv: [12, +, 26, *, 3, /, 6, -] [288.0, +, 39]
PlusOrDiv: [12, +, 26, *, 3, /, 6] [288.0, +, 39, -]
PlusOrDiv: [12, +, 26, *, 3, /] [288.0, +, 39, -, 6]
PlusOrDiv: [12, +, 26, *] [288.0, +, 39, -, 0.5]
PlusOrDiv: [12, +] [288.0, +, 39, -, 13.0]
PlusOrDiv: [12] [288.0, +, 39, -, 13.0, +]
AddOrDec: [288.0, +, 39, -, 13.0, +, 12]
AddOrDec: [288.0, +, 39, -, 25.0]
AddOrDec: [288.0, +, -14.0]
AddOrDec: [274.0]
FinalResult: [274.0]
*/