文章目录
表达式运算实现:
1.栈实现
public class ExpressCalc {
public static void main(String[] args) {
/*
使用栈实现一个0-9整数带括号的表达式计算
处理步骤:
1.创建两个栈,一个符号栈(左括号、右括号、加、减、乘、除),左括号优先级最高,右括号优先级最低,一个数字栈(0-9)
2.遇到数字:直接入数字栈
3.遇到符号:
如果符号栈为空,则直接入符号栈
如果当前符号优先级 > 栈顶符号优先级:直接入符号栈
如果当前符号优先级 <= 栈顶符号优先级:将数字栈与符号栈元素弹出,进行运算,直到栈为空或者当前符号优先级 > 栈顶符号优先级为止
*/
String[] expressArray = {
"2+3*(1+2*4)-3*5",
"2+3",
"2+3+(3*4/2)-1",
"2+3+(3*4/2+5)-1",
"2+3+(3*4/2+5-9)-1",
"2+3+(3*4/2+5-9)-1+2*(1+2)",
"2",
};
for (String expressStr : expressArray) {
int num = calcExpress(expressStr);
System.out.println(expressStr + "=" + num);
}
}
private static int calcExpress(String expressStr) {
Stack<Integer> numSt = new Stack<>();
Stack<Character> symbolSt = new Stack<>();
char[] cs = expressStr.toCharArray();
for (int i = 0; i < cs.length; i++) {
// 匹配数字
if(String.valueOf(cs[i]).matches("\\d")){
numSt.add(cs[i] - '0');
}else if(cs[i] == '+' || cs[i] == '-' || cs[i] == '*' || cs[i] == '/' || cs[i] == '(' || cs[i] == ')'){
if(symbolSt.isEmpty() || priority(cs[i], symbolSt.peek())){
symbolSt.add(cs[i]);
}else{
while(!symbolSt.isEmpty() && symbolSt.peek() != '(' && !priority(cs[i], symbolSt.peek())){
Integer n1 = numSt.pop();
Integer n2 = numSt.pop();
int res = calc(n2, n1, symbolSt.pop());
numSt.add(res);
}
if(!symbolSt.isEmpty() && symbolSt.peek() == '(') symbolSt.pop();
if(cs[i] != ')') symbolSt.add(cs[i]);
}
}
}
while(!symbolSt.isEmpty()){
Integer n1 = numSt.pop();
Integer n2 = numSt.pop();
int res = calc(n2, n1, symbolSt.pop());
numSt.add(res);
}
return numSt.pop();
}
// 优先级判断 a > b : 返回true,否则返回false
public static boolean priority(char a, char b){
if(a == '(') return true;
if((a == '*' || a == '/') && (b == '+' || b == '-' || b == ')')) return true;
if((a == '+' || a == '-') && b == ')') return true;
return false;
}
public static int calc(int a, int b, char express){
switch (express){
case '+':
return a + b;
case '-':
return a - b;
case '*':
return a * b;
case '/':
return a / b;
default:
throw new RuntimeException("不支持" + express + "进行运算");
}
}
}
2.中缀表达式转后缀表达式计算
本文含有隐藏内容,请 开通VIP 后查看