想用正则搞个能识别()以及基本运算优先级的代码,弄得时候感觉太复杂了,弄不了
这个只能对题中这种倒着一路加减乘过去起作用,麻了
public class Main { public static void main(String[] args) { String exp = "x + 2 * (y - 5)"; SuffixExpression se = compile(exp); Map<String, Integer> env = Map.of("x", 1, "y", 9); int result = se.execute(env); System.out.println(env); System.out.println(exp + " = " + result + " " + (result == 1 + 2 * (9 - 5) ? "✓" : "✗")); } static SuffixExpression compile(String exp) { String exp0=exp.replaceAll(" ",""); char[] chars=exp0.toCharArray(); Deque<Object> dequeNumber=new LinkedList(); Deque<String> dequeChar=new LinkedList(); for(char s:chars){ switch (s){ case '1','2','3','4','5','6','7','8','9' ->{dequeNumber.push(Character.getNumericValue(s));} case '+','-','*','/' ->{dequeChar.push(String.valueOf(s));} case 'x','y' ->{dequeNumber.push(String.valueOf(s));} default -> {} } } return new SuffixExpression(dequeNumber,dequeChar); } } class SuffixExpression { private Deque number; private Deque opt; public SuffixExpression(Deque<Object> number,Deque<String> opt){ this.number=number; this.opt=opt; } int execute(Map<String, Integer> env) { do{ if(number.peek() instanceof String){ number.push(env.get(number.pop())); } int num1=(int) number.pop(); if(number.peek() instanceof String){ number.push(env.get(number.pop())); } int num2=(int)number.pop(); String opt1= (String) this.opt.pop(); number.push(calcu(num1,num2,opt1)); }while (this.opt.size()!=0); // TODO: return (int)this.number.pop(); } public static int calcu(int num1,int num2,String opt){ switch (opt){ case "+" ->{return num1+num2;} case "-" ->{return num2-num1;} case "*" ->{return num2*num1;} case "/" ->{return num2/num1;} default -> {return 0;} } } }
Sign in to make a reply
嗨呀呦嘿吆
想用正则搞个能识别()以及基本运算优先级的代码,弄得时候感觉太复杂了,弄不了
这个只能对题中这种倒着一路加减乘过去起作用,麻了