华为机试LISP加减乘除语句解析

ss98791616 2021-03-28 10:53:30
第一题
简单的 LISP 加减乘除语句解析并计算结果,四种运算符号为 add、sub、mul、div,分别为加减乘除。其中数字部分皆为整数。除法取整,除数为零输出 error。
例子:
(add 3 5 7) 结果为 15

(sub 1 9) 结果为 -8

(mul 0 9) 结果为 0

(div 8 3) 结果为 2

(div 8 0) 结果为 error

(add (sub (div 8 2) (mul 1 9)) 20) 结果为 15



public static void main(String[] args) throws IOException {
String s="(add (sub (div 8 2) (mul 1 9)) 20)";
// for (String s1 : s.split("\\(")) {
// System.out.println(s1);
// }
System.out.println(operation(s));


}
public static String operation(String str){
if (str.indexOf("(",1)==-1){
String[] split = str.split("\\s+");
String ope = split[0].replace("(","");
int c1 = Integer.parseInt(split[1].replace(")",""));
int c2 = Integer.parseInt(split[2].replace(")",""));
int result=-1;
if ("div".equals(ope)&&c2==0){
return "error";
}
switch (ope){
case "div":
result=c1/c2;
break;
case "add":
result=c1+c2;
break;
case "mul":
result=c1*c2;
break;
case "sub":
result=c1-c2;
break;
}
return String.valueOf(result);
}
int left=str.lastIndexOf("("),right=str.indexOf(")",left);
String substring = str.substring(left, right+1);
String result = " "+operation(substring);
StringBuilder sb = new StringBuilder(str);
sb.replace(left,right+1,result.replace(")",""));
return operation(sb.toString());
}
...全文
289 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
" " "Tcl编程简介(一) " "  " "简介 " "  Tcl是一种很通用的脚本语言,它几乎在所有的平台上都可以解释 " "运行,功能强大。是tool command language的缩写,发音为 " ""tickle", 实际上包含了两个部分:一个语言和一个库。 " "  首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一 " "些互交程序如文本编辑器、调试器和shell。它有一个简单的语法 " "和很强可扩充性,Tcl可以创建新的过程以增强其内建命令的能力。 " "  其次,Tcl是一个库包,可以被嵌入应用程序,Tcl的库包含了一个" "分析器、用于执行内建命令的例程和可以使你扩充(定义新的 过程) " "的库函数。应用程序可以产生Tcl命令并执行,命令可以由用户产生, " "也可以从用户接口的一个输入中读取(按钮或菜单等)。 " "但Tcl库收到命令后将它分解并执行内建的命令,经常会产生递归的调 " "用。 " "  下面简单介绍以下tcl的语法规则: " "解释器 " "  在Tcl的数据结构中的核心是Tcl_Interp.一个解释器包含了一套命" "令,一组变量和一些用于描述状态的东西。每一个 Tcl命令是 在特定 " "的Tcl_Interp中运行的,基于Tcl的应用程序可以同时拥有几个Tcl_Inte" "rp。Tcl_Interp是一个轻量级的结构,可以快速的新建和删除。 " "数据类型 " "  Tcl只支持一种数据结构:字符串(string)。所有的命令,命令 " "的所有的参数,命令的结果,所有的变量都是字符串。请牢记这一点," "所有的东西都是字符串。 这是它比较有特点的方面字符串有三种形式 " ":命令(command), 表达式(expresion)和表(list)。 " "Basic Command Syntax 基本语法 " "  Tcl有类似于shell和lisp的语法,当然也有许多的不同。一 " "条Tcl的命令串包含了一条或多条命令用换行符或分号来隔开,而每一 " "条命令包含了一个域(field)的集合,域使用空白分开的,第一个域是 " "一个命令的名字,其它的是作为参数来传给它。 " "  例如: " "  set a 22 //相当于C中的 a=22 a是一个变量这条命令分为三个域 " ":1 set 2 a 3 22 set使用于设置变量的值的命令,a、20 " "作为参数来传给它,a使它要操作的变量名,22是要付给的a值。 " "  Tcl的命令名可以是内置的命令也可以是用户建的新命令,如果是 " "用户用户建的新命令应用程序中用函数Tcl_CreateCommand来创建。所 " "有的参数作为字符串来传递,命令自己会按其所需来解释的参数的。命" "令的名字必须被打全,但 Tcl解释器找不到一同名的命令时会用 " "unknown命令来代替。 " "  在很多场合下,unknown " "会在库目录中搜寻,找到一个的话,会自动生成一个Tcl命令并调用它 " "。unknown经常完成缩略的命令名的执行。但最好不要使用。 " "注释 " "  和shell很象,第一个字母是"#"的Tcl字符串是注释。 " "其他细节规则 " "  Grouping arguments with double-quotes " "用双引号来集群参数,目的在于使用有空白的参数。 " "  例如: " "set a "this string contains whitespace" " " " "  如够一个参数一双引号来开始,该参数会一直到下一个双引号才结" "束。其中可以有换行符和分号。 " "  Variable substitution with $ 用美元符进行变量替换说白了就 " "是引用该变量。 " "  如: " " " "set a hello " "set b $a // b = "hello" 实际上传给set命令的参数 " "//是b,"hello" " "set c a // b = "a" " " " "  Command substitution with brackets 命令子替换(用方括号) " "  例如: " "set a [set b "hello"] " " " "  实现执行 set b "hello" 并用其结果来替换源命令 " "中的方括号部分,产生一条新命令 " "  set a "hello" //"hello" 为 set b "hello" 的返回值 " "  最终的结果是b="hello" a="hello" " "  当命令的一个子域以方括号开始以方括号结束,表示要进行一个命" "令子替换。并执行该子命令,用其结果来替换原命

67,543

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧