可以检测括号配对问题,进行多数加减乘除的运算:
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
public class Test {
static Stack<Character> opt = new Stack<Character>();// 操作符寄存器
static Stack<Integer> nums = new Stack<Integer>();// 数字寄存器
static Map<String, Integer> p = new HashMap<String, Integer>();
public static void main(String[] args) {
String str = "1+1";
System.out.println(cal("3+(4+5)*6-1+"));
}// main方法
public static int cal(String str) {
char[] cs = str.toCharArray();
p.put("(", 3);// 给符号设置优先级 3最大 0最小
p.put(")", 0);
p.put("+", 1);
p.put("-", 1);
p.put("*", 2);
p.put("/", 2);
String num = "";
for (char c : cs) {
if (c >= '0' && c <= '9') {
num += c;
} else {
if (!"".equals(num)) {
nums.push(Integer.parseInt(num));
num = "";
}
}
switch (c) {
case '(':
opt.push('(');
break;
case ')':
cal(')');
break;
case '+':
cal('+');
break;
case '-':
cal('-');
break;
case '*':
cal('*');
break;
case '/':
cal('/');
break;
}
}// for
return nums.peek();
}
public static void cal(char c) {
int num1, num2;
if (!opt.isEmpty()) {
switch (opt.peek()) {
case '(':
if (")".equals(c + "")) {
opt.pop();
} else {
opt.push(c);
}
break;
case '+':
cam('+', c);
break;
case '-':
cam('-', c);
break;
case '*':
cam('*', c);
break;
case '/':
cam('/', c);
break;
}// switch
}// if
else {
opt.push(c);
}
}
public static void cam(char pre, char now) {
if (p.get(pre + "") < p.get(now + "")) {
opt.push(now);
} else if (pre != '(') {
int num1 = nums.pop();// 第二个数
int num2 = nums.pop();// 第一个数
switch (pre) {
case '+':
nums.push(num2 + num1);
break;
case '-':
nums.push(num2 - num1);
break;
case '*':
nums.push(num2 * num1);
break;
case '/':
nums.push(num2 / num1);
break;
}
} else if (now == ')' && pre == '(') {
return;
}
opt.pop();// 先取出来再进行判断
if (!opt.isEmpty()) {
cam(opt.peek(), now);
} else {
opt.push(now);
}// if
}
}