Discuss / Java / 用的笨方法,不太通用

用的笨方法,不太通用

Topic source

想用正则搞个能识别()以及基本运算优先级的代码,弄得时候感觉太复杂了,弄不了

这个只能对题中这种倒着一路加减乘过去起作用,麻了

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;}
      }
   }
}

  • 1

Reply