题目:
LISP语言唯一的语法就是括号要配对。
形如 (OP P1 P2 …),括号内元素由单个空格分割。
其中第一个元素OP为操作符,后续元素均为其参数,参数个数取决于操作符类型
注意:参数 P1, P2 也有可能是另外一个嵌套的 (OP P1 P2 …)
当前OP类型为add/sub/mul/div(全小写),分别代表整数的加减乘除法。简单起见,所以OP参数个数为2
举例
-输入:(mul 3 -7)输出:-21
输入:(add 1 2) 输出:3
输入:(sub (mul 2 4) (div 9 3)) 输出 :5
输入:(div 1 0) 输出:error --------------------- 本文来自 liuxinyang666 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/liuxinyang666/article/details/79048639?utm_source=copy
代码:
import java.util.Scanner; import java.util.Stack; public class Main { //(sub (mul 2 4) (div 9 3)) public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String line = scanner.nextLine(); calculatorLISP(line); scanner.close(); } private static void calculatorLISP(String str) { Stack<Integer> numStack = new Stack<Integer>(); Stack<String> operStack =new Stack<String>(); int mark = 0; int paramOne = 0; int paramTwo = 0; for(int i = 0; i < str.length() ; i++) { char c = str.charAt(i); if(c == '('){ operStack.push(str.substring(i+1,i+4)); i+=4; mark = i+1; }else if(c == ')'){ if(mark < i){ numStack.push(Integer.valueOf(str.substring(mark,i))); i++; mark = i+1; } paramTwo = numStack.pop(); paramOne = numStack.pop(); calc(numStack,operStack,paramOne,paramTwo); }else{ if(c == ' '){ if(mark < i){ numStack.push(Integer.valueOf(str.substring(mark,i))); mark = i + 1; } } } } while(!operStack.isEmpty()) { paramTwo = numStack.pop(); paramOne = numStack.pop(); calc(numStack,operStack,paramOne,paramTwo); } System.out.println(numStack.pop().toString()); } public static void calc(Stack<Integer> numStack,Stack<String> operStack,int paramOne, int paramTwo){ switch(operStack.pop()) { case "add": numStack.push(paramOne + paramTwo); break; case "sub": numStack.push(paramOne - paramTwo); break; case "mul": numStack.push(paramOne * paramTwo); break; case "div": if(paramTwo == 0) { System.out.println("error"); }else{ numStack.push(paramOne / paramTwo); } break; } } }