直接上代码,水平有限,欢迎小伙伴们指正(暂不知效率如何)

import java.util.Scanner;

import java.util.Stack;

/**

* 仿LISP字符串运算

* LISP语言唯一的语法就是括号要配对。

* 形如 (OP P1 P2 …),括号内元素由单个空格分割。

* 其中第一个元素OP为操作符,后续元素均为其参数,参数个数取决于操作符类型

* 注意:参数 P1, P2 也有可能是另外一个嵌套的 (OP P1 P2 …)

* 当前OP类型为add/sub/mul/div(全小写),分别代表整数的加减乘除法。

* 四种类型的参数个数均为2个

* 举例

* -输入:(mul 3 -7)输出:-21

* 输入:(add 1 2) 输出:3

* 输入:(sub (mul 2 4) (div 9 3)) 输出 :5

* 输入:(div 1 0) 输出:error

*/

public class Main {

public static void main(String[] args) {

Scanner scanner = new Scanner(System.in);

String input = scanner.nextLine();

// 存放操作符的栈

Stack opStack = new Stack<>();

// 存放计算结果的栈

Stack dataStack = new Stack<>();

try {

exec(input, opStack, dataStack);

} catch (Exception e) {

System.out.println("error");

}

}

/*

1、从头开始遍历字符,遇到左括号,就将其后边的三个操作符压入操作符栈中

2、遇到数字,就将其压入数据栈中(考虑连续数字和负数)

3、遇到右括号,就从操作符栈中出栈最近的操作符

4、然后在数据栈中出栈两个数字

5、通过第3步的操作符和第4步的两个数字进行计算

6、将第5步的计算结果压入数据栈中

7、重复执行上述1~6,直到操作符栈为空,输出数据栈的结果即可

*/

public static void exec(String input, Stack opStack, Stack dataStack) {

int length = input.length();

for (int i = 0; i < length; ) {

char c = input.charAt(i);

// 如果是空格,跳过当前循环

if (c == ' ') {

i++;

continue;

}

if (c == '(') {

// 操作符入栈

opStack.push(input.substring(i + 1, i + 4));

// 修改循环下标并跳过当前循环

i = i + 4;

continue;

}

// 如果是数字,连续读取,并压入数据栈

if (c == '-' || Character.isDigit(c)) {

int j = i;

while (Character.isDigit(input.charAt(j + 1))) {

j++;

}

dataStack.push(Integer.valueOf(input.substring(i, j + 1)));

i = j + 1;

continue;

}

if (c == ')') {

// 取出操作符和数据,并将计算结果压入数据栈中

String op = opStack.pop();

Integer p2 = dataStack.pop();

Integer p1 = dataStack.pop();

Integer result = calculate(op, p1, p2);

dataStack.push(result);

i++;

}

}

if (opStack.empty()) {

// 如果操作符栈为空,则输出数据栈结果

System.out.println(dataStack.pop());

} else {

throw new RuntimeException();

}

}

public static Integer calculate(String op, Integer p1, Integer p2) {

switch (op) {

case "add":

return p1 + p2;

case "sub":

return p1 - p2;

case "mul":

return p1 * p2;

case "div":

return p1 / p2;

default:

throw new RuntimeException();

}

}

}

文字加减前后缀lisp_华为笔试题---仿LISP算法相关推荐

  1. 文字加减前后缀lisp_日本搞笑艺人催泪讲授汉字课堂告诉你文字背后的意义!...

    点击上方蓝字关注我们 初中的语文课上,你一定会上过汉字的构成法「六书」,从此之后在学生眼中所有的中文字,都被分类为象形.指示.会意.形声--等等.前阵子,小编在网路上看了一段日本节目的影片,『汉字课堂 ...

  2. 文字加减前后缀lisp_LISP 图层前后缀_显示图层的Lisp程式

    (defun c:WW();定义WW命令 (setvar "Expert" 1):禁止显示"准备重生成,是否继续?"以及"是否确实要关闭当前图层?&q ...

  3. 仿lisp运算 java_华为机试题:仿LISP

    packagecom.nowcoder.huawei;import java.util.*;public classLISP {//只通过80%//(+ (* 2 3) (^ 4))//(+ (* 2 ...

  4. 华为笔试题---明明的随机数

    题目 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着 ...

  5. 【leetcode】第394题:字符串解码(华为笔试题)

    题目:给定一个经过编码的字符串,返回它解码后的字符串. 编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次.注意 k 保证为正整数. ...

  6. 华为笔试题 -- 多个数组按顺序合并(Java代码实现)

    华为笔试题 – 多个数组按顺序合并(Java代码实现) 题目描述: 现在有多组整数数组,需要将他们合并成一个新的数组.合并规则,从每个数组里按顺序取出固定长度的内容合并到新的数组中,取完的内容会删除掉 ...

  7. 2019届华为笔试题(软件卷)

    华为笔试题共3道编程题.第一题100分,第二题200分,第三题300分,一共600分. 第一题: 输入描述: 1.忽略小数点,例如"A1.2",认为包含整数1和2: 2.如果整数的 ...

  8. en结尾的单词_形容词加en前后缀变动词的英语单词不一定变动词,其他词性也可以...

    优质解答 1. hreat→threaten恐吓 2. strength→strengthen:使--变长,加强,巩固,使强大 3. loose→loosen 使放松 4. tight→tighten ...

  9. 2014-百度 阿里 华为笔试题

    8月15日,百度2道面试题: 1.来自<编程之美>的概率题:一个桶里面有白球.黑球各100个,现在按下述规则取球:的     i .每次从通里面拿出来两个球:     ii.如果取出的是两 ...

最新文章

  1. 独家 | 年度盘点!必看AI顶会论文、Github高星项目大合集(附链接)
  2. Boost:无序的bimap双图的测试程序
  3. 工作75::一直报404
  4. express中的错误处理
  5. mysql记录虚拟货币数据类型_近几年虚拟货币应用情况的相关数据
  6. 编写一个函数把华氏温度转换为摄氏温度
  7. Docker快速入门(一)
  8. TensorFlow2学习笔记:3、鸢尾花数据集载入
  9. 现代OpenGL教程 01 - 入门指南
  10. HTML添加背景音乐代码
  11. WPS2003排版位置错误一例(转)
  12. 与iPhone5国行A1429的故事:越狱、降级刷机、完美电信3G、不完美电信4G、撸油管
  13. ES集群不通,日志报[node-3] not enough master nodes discovered during pinging (found [[Candidate{node={node-3
  14. ie11启用java时打不开_ie11打不开解决方法
  15. 值得收藏的12款小众冷门但功能强大的在线神器
  16. PowerCHM-强大的CHM工具
  17. Hadoop性能测试工具
  18. java exchange 日历_Exchange Server EWS 模拟:为与会人员添加日历会议日程(Calendar Item)...
  19. 自动驾驶专题介绍 ———— 转向系统
  20. Win2000/XP服务与后门技术(zz)

热门文章

  1. Asp.net SignalR 应用并实现群聊功能 开源代码
  2. CSS 实现打字效果
  3. 虚拟化厂商VMware、微软和思杰的vGPU支持概述
  4. 火箭队老板成比特币粉丝 旗下豪车经销商接受BTC、BCH支付
  5. java 调 pro*c
  6. ECJTUACM16 Winter vacation training #5 题解源码
  7. 学习笔记--zabbix
  8. JAVA字符串格式化-String.format()的使用
  9. Win2003利用dfs(分布式文件系统)在负载均衡下的文件同步配置方案
  10. js 判断一个元素是否存在