字符串中的表达式计算
思路:
-
如果字符串中没有括号:
每遇到一个字符,把它放进栈里(如果是数字字符,需要结合字符串将其转换成数字)。当一个数字进栈之前发现栈顶元素为
*
或/
,则连续弹出两次栈顶,计算该表达式的结果,并把结果放入栈中。这样做保证栈中的元素只有数字、
+
、-
,当字符串遍历完,计算栈中的表达式就行。 -
如果字符串中有括号:
设计一个函数
int[] value(String str, int index)
,该函数的作用是计算括号中的表达式。如果遇到一个左括号(
,则执行函数value,传入参数str和左括号的下标加1。直到遇到右括号。函数返回一个数组arr,数组长度为2,arr[0]表示该括号内表达式的结果,arr[1]表示右括号的的下标+1,即继续执行计算的位置。每遇到一个左括号
(
都执行一次上述的递归运算。
import java.util.LinkedList;
public class Code_07_ExpressionCompute {
//主函数
public static int getValue(String str) {
return value(str.toCharArray(), 0)[0];
}
//处理括号内的表达式
public static int[] value(char[] str, int i) {
//准备一个双向队列,用于存放无括号的字符
LinkedList<String> que = new LinkedList<String>();
int pre = 0;//处理字符串中的数字
int[] bra = null;//返回结果
while (i < str.length && str[i] != ')') {
if (str[i] >= '0' && str[i] <= '9') {
pre = pre * 10 + str[i++] - '0';
} else if (str[i] != '(') {如果字符是+-*/
addNum(que, pre);
que.addLast(String.valueOf(str[i++]));
pre = 0;
} else {如果字符是(,递归调用vaule()
bra = value(str, i + 1);
pre = bra[0];
i = bra[1] + 1;
}
}
addNum(que, pre);
return new int[] { getNum(que), i };
}
//处理没有括号的表达式,遇到*/先计算,计算结果放进栈
public static void addNum(LinkedList<String> que, int num) {
if (!que.isEmpty()) {
int cur = 0;
String top = que.pollLast();
if (top.equals("+") || top.equals("-")) {
que.addLast(top);
} else {
cur = Integer.valueOf(que.pollLast());
num = top.equals("*") ? (cur * num) : (cur / num);
}
}
que.addLast(String.valueOf(num));
}
//只用来处理栈中只有数字、+、-的情况
public static int getNum(LinkedList<String> que) {
int res = 0;
boolean add = true;
String cur = null;
int num = 0;
while (!que.isEmpty()) {
cur = que.pollFirst();
if (cur.equals("+")) {
add = true;
} else if (cur.equals("-")) {
add = false;
} else {
num = Integer.valueOf(cur);
res += add ? num : (-num);
}
}
return res;
}
public static void main(String[] args) {
String exp = "48*((70-65)-43)+8*1";
System.out.println(getValue(exp));
exp = "4*(6+78)+53-9/2+45*8";
System.out.println(getValue(exp));
exp = "10-5*3";
System.out.println(getValue(exp));
exp = "-3*4";
System.out.println(getValue(exp));
exp = "3+1*4";
System.out.println(getValue(exp));
}
}