文字加减前后缀lisp_华为笔试题---仿LISP算法
直接上代码,水平有限,欢迎小伙伴们指正(暂不知效率如何)
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算法相关推荐
- 文字加减前后缀lisp_日本搞笑艺人催泪讲授汉字课堂告诉你文字背后的意义!...
点击上方蓝字关注我们 初中的语文课上,你一定会上过汉字的构成法「六书」,从此之后在学生眼中所有的中文字,都被分类为象形.指示.会意.形声--等等.前阵子,小编在网路上看了一段日本节目的影片,『汉字课堂 ...
- 文字加减前后缀lisp_LISP 图层前后缀_显示图层的Lisp程式
(defun c:WW();定义WW命令 (setvar "Expert" 1):禁止显示"准备重生成,是否继续?"以及"是否确实要关闭当前图层?&q ...
- 仿lisp运算 java_华为机试题:仿LISP
packagecom.nowcoder.huawei;import java.util.*;public classLISP {//只通过80%//(+ (* 2 3) (^ 4))//(+ (* 2 ...
- 华为笔试题---明明的随机数
题目 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着 ...
- 【leetcode】第394题:字符串解码(华为笔试题)
题目:给定一个经过编码的字符串,返回它解码后的字符串. 编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次.注意 k 保证为正整数. ...
- 华为笔试题 -- 多个数组按顺序合并(Java代码实现)
华为笔试题 – 多个数组按顺序合并(Java代码实现) 题目描述: 现在有多组整数数组,需要将他们合并成一个新的数组.合并规则,从每个数组里按顺序取出固定长度的内容合并到新的数组中,取完的内容会删除掉 ...
- 2019届华为笔试题(软件卷)
华为笔试题共3道编程题.第一题100分,第二题200分,第三题300分,一共600分. 第一题: 输入描述: 1.忽略小数点,例如"A1.2",认为包含整数1和2: 2.如果整数的 ...
- en结尾的单词_形容词加en前后缀变动词的英语单词不一定变动词,其他词性也可以...
优质解答 1. hreat→threaten恐吓 2. strength→strengthen:使--变长,加强,巩固,使强大 3. loose→loosen 使放松 4. tight→tighten ...
- 2014-百度 阿里 华为笔试题
8月15日,百度2道面试题: 1.来自<编程之美>的概率题:一个桶里面有白球.黑球各100个,现在按下述规则取球:的 i .每次从通里面拿出来两个球: ii.如果取出的是两 ...
最新文章
- 独家 | 年度盘点!必看AI顶会论文、Github高星项目大合集(附链接)
- Boost:无序的bimap双图的测试程序
- 工作75::一直报404
- express中的错误处理
- mysql记录虚拟货币数据类型_近几年虚拟货币应用情况的相关数据
- 编写一个函数把华氏温度转换为摄氏温度
- Docker快速入门(一)
- TensorFlow2学习笔记:3、鸢尾花数据集载入
- 现代OpenGL教程 01 - 入门指南
- HTML添加背景音乐代码
- WPS2003排版位置错误一例(转)
- 与iPhone5国行A1429的故事:越狱、降级刷机、完美电信3G、不完美电信4G、撸油管
- ES集群不通,日志报[node-3] not enough master nodes discovered during pinging (found [[Candidate{node={node-3
- ie11启用java时打不开_ie11打不开解决方法
- 值得收藏的12款小众冷门但功能强大的在线神器
- PowerCHM-强大的CHM工具
- Hadoop性能测试工具
- java exchange 日历_Exchange Server EWS 模拟:为与会人员添加日历会议日程(Calendar Item)...
- 自动驾驶专题介绍 ———— 转向系统
- Win2000/XP服务与后门技术(zz)