【华为OD机试】仿 LISP 运算 (C++ Python Java)2023 B卷

该博客介绍了如何解决华为在线开发者测试中的一道仿LISP运算题目。题目要求实现加减乘除操作,支持嵌套表达式,并处理除零错误。给出的思路是使用栈来处理括号和运算,遇到数字入栈,遇到操作符则进行计算。重点考察数据结构栈的应用。

时间限制:C/C++ 1秒,其他语言 2秒

空间限制:C/C++262144K,其他语言524288K

64bit IO Format:%lld

语言限定: C(clang11), C++(clang++11), Pascal(fpc 3.0.2), Java(javac 1.8), Python2(2.7.3), PHP(7.4.7), C#(mcs5.4), ObjC(gcc 5.4), Pythen3(3.9), JavaScript Node(12.18.2), JavaScript V8(6.0.0), Sqlite(3.7.9), R(4.0.3), Go(1.14.4), Ruby(2.7.1), Swift(5.3), matlab(Octave 5.2), Pypy2(pypy2.7.13), Pypy3(pypy3.6.1), Rust(1.44), Scala(2.11.12), Kotlin(1.4.10), Groovy(3.0.6), TypeScript(4.1.2), Mysql(8.0)

题目描述

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

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

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

注意:

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

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

简单起见,所有 OP 参数个数均为 2 。

### 华为OD中的仿LISP运算华为OD题目中,涉及到一种模仿LISP语言特性的表达式求值问题。这种表达式的结构遵循前缀表示法,即操作符位于其两个操作数之前[^1]。 #### 表达式解析与计逻辑 对于给定的操作 `add`、`sub`、`mul` 和 `div` 来说,这些都对应于基本运算:加法、减法、乘法以及除法。每个操作可以接受另外两个参数作为输入,这两个参数既可以是具体的数值也可以是指向其他更深层次嵌套表达式的指针[^2]。 当遇到形如 `(op p1 p2)` 的模式时,程序应当识别 op 是哪种类型的二元运算,并据此处理后续的 p1 和 p2 参数。如果 p1 或者 p2 自身又是一个新的子表达式,则需递归地对其进行相同形式的分析直到所有的内部表达都被完全展开并执行相应的数学运算得到最终的结果。 下面给出一段Python代码来展示如何实现这样的功能: ```python def evaluate(expression): if isinstance(expression, int): # 如果是数字直接返回 return expression operator, *operands = expression # 解构赋值获取操作符和其他部分 evaluated_operands = [evaluate(operand) for operand in operands] match operator.lower(): case 'add': result = sum(evaluated_operands) case 'sub': result = evaluated_operands[0] - sum(evaluated_operands[1:]) case 'mul': from functools import reduce result = reduce(lambda x, y: x*y, evaluated_operands, 1) case 'div': result = evaluated_operands[0] for num in evaluated_operands[1:]: result /= num return round(result) # 测例子 print(evaluate(['ADD', ['MUL', 3, 4], ['DIV', 8, 2]])) ``` 此段代码实现了对类似于 LISP 风格的列表表达式的解释器,能够正确处理多层嵌套的情况,并按照指定规则完成四则运算
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dijkstra2023

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值