文章目录
- 表达式运算实现:
- 1.栈实现
- 2.中缀表达式转后缀表达式计算
表达式运算实现:
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,否则返回falsepublic 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.中缀表达式转后缀表达式计算
https://blog.csdn.net/Linging_24/article/details/104481492