題目:
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; } } }
