[华为机试] 仿LISP字符串运算


题目:

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

}
  

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM