欢迎来到Introzo百科
Introzo百科
【华为OD机试】仿LISP运算(python, java, c++, js)
仿LISP运算
前言:本专栏将持续更新华为OD机试题目,并进行详细的分析与解答,包含完整的代码实现,希望可以帮助到正在努力的你。关于OD机试流程、面经、面试指导等,如有任何疑问,欢迎联系我,wechat:steven_moda;email:support@www.introzo.com;备注:CSDN。
题目描述
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
输入描述
合法字符串,字符串长度不超过512,用例保证了无语法错误。
输出描述
输出计算结果或者“error”
示例1
输入
(div 12 (sub 45 45))
输出
error
示例2
输入
(add 1 (div -7 3))
输出
-2
代码:python
import sysdef function():expression = input()num_stack = []operation_stack = []mark = 0param_one = 0param_two = 0for i in range(len(expression)):ch = expression[i]if ch == "(":operation_stack.append(expression[i+1: i+4])i += 4mark = i + 1elif ch == ")":if mark < i:num_stack.append(int(expression[mark: i]))i += 1mark = i + 1param_two = num_stack.pop()param_one = num_stack.pop()num_stack, operation_stack = calc(num_stack, operation_stack, param_one, param_two)else:if ch == " ":if mark < i:num_stack.append(int(expression[mark: i]))mark = i + 1while len(operation_stack) != 0:param_two = num_stack.pop()param_one = num_stack.pop()num_stack, operation_stack = calc(num_stack, operation_stack, param_one, param_two)print(num_stack[0])def calc(num_stack, operation_stack, param_one, param_two):op = operation_stack.pop()if op == "add":num_stack.append(param_one + param_two)elif op == "sub":num_stack.append(param_one - param_two)elif op == "mul":num_stack.append(param_one * param_two)else:if param_two == 0:print("error")sys.exit()else:num_stack.append(param_one // param_two)return num_stack, operation_stackif __name__ == '__main__':function()
代码:java
import java.util.Scanner;
import java.util.Stack;public class Main01 {static Stack<Integer> num_stack = new Stack<>(); // 数字栈static Stack<String> opera_stack = new Stack<>(); // 操作符栈// 计算表达式(param_1 op param_2)的值public static void calc(int param_1, int param_2) {String op = opera_stack.pop();if (op.equals("add")) {num_stack.push(param_1 + param_2);} else if (op.equals("sub")) {num_stack.push(param_1 - param_2);} else if (op.equals("mul")) {num_stack.push(param_1 * param_2);} else {if (param_2 == 0) {System.out.println("error");System.exit(0);} else {int res = param_1 / param_2;if (param_1 % param_2 != 0) {if (res < 0) {res -= 1;} else {res += 1;}}num_stack.push(res);}}}public static int solution_01() {// 处理输入Scanner sc = new Scanner(System.in);String exp = sc.nextLine();int mark = 0;int param_1 = 0; // 参数1int param_2 = 0; // 参数2for (int i=0; i<exp.length(); i++) {String ch = exp.charAt(i) + "";if (ch.equals("(")) {opera_stack.push(exp.substring(i + 1, i + 4));i += 4;mark = i + 1;} else if (ch.equals(")")) {if (mark < i) {num_stack.push(Integer.parseInt(exp.substring(mark, i)));i += 1;mark = i + 1;}param_2 = num_stack.pop();param_1 = num_stack.pop();calc(param_1, param_2);} else {if (ch.equals(" ")) {if (mark < i) {num_stack.push(Integer.parseInt(exp.substring(mark, i)));mark = i + 1;}}}}while (opera_stack.size()!= 0) {param_2 = num_stack.pop();param_1 = num_stack.pop();calc(param_1, param_2);}return num_stack.get(0);}public static void main(String[] args) {int ans = solution_01();System.out.println(ans);}
}
代码:c++
#include
#include
#include using namespace std;// 数字栈
stack num_stack;// 操作符栈
stack opera_stack;// 计算表达式(param_1 op param_2)的值
void calc(int param_1, int param_2) {string op = opera_www.introzo.com();opera_stack.pop();if (op == "add") {num_stack.push(param_1 + param_2);} else if (op == "sub") {num_stack.push(param_1 - param_2);} else if (op == "mul") {num_stack.push(param_1 * param_2);} else {if (param_2 == 0) {cout << "error" << endl;exit(0);} else {int res = param_1 / param_2;if (param_1 % param_2 != 0) {if (res < 0) {res -= 1;} else {res += 1;}}num_stack.push(res);}}
}int solution_01() {// 处理输入string exp;getline(cin, exp);int mark = 0;int param_1 = 0; // 参数1int param_2 = 0; // 参数2for (int i = 0; i < exp.length(); i++) {string ch = exp.substr(i, 1);if (ch == "(") {opera_stack.push(exp.substr(i + 1, 3));i += 4;mark = i + 1;} else if (ch == ")") {if (mark < i) {num_stack.push(stoi(exp.substr(mark, i - mark)));i += 1;mark = i + 1;}param_2 = num_www.introzo.com();num_stack.pop();param_1 = num_www.introzo.com();num_stack.pop();calc(param_1, param_2);} else {if (ch == " ") {if (mark < i) {num_stack.push(stoi(exp.substr(mark, i - mark)));mark = i + 1;}}}}while (!opera_stack.empty()) {param_2 = num_www.introzo.com();num_stack.pop();param_1 = num_www.introzo.com();num_stack.pop();calc(param_1, param_2);}return num_www.introzo.com();
}int main() {int ans = solution_01();cout << ans << endl;return 0;
}
代码:js
待更新…
相关文章
- 10-05 长电科技表示,已具备4nm手机芯片封装能力,以及C
- 10-05 中国信息通信研究院公布可信隐私计算评估结果, Mo
- 10-05 信通院:2022年7月国内手机出货量1990.8万
- 10-05 Numpy.frompyfunc() 将计算单个值
- 10-05 C语言·删除数组第0个元素
- 10-05 (2)NumPy库初识(数组运算和运算)
- 10-05 什么是手机副卡
- 10-05 副手机卡可以独立吗?
- 10-05 手机主卡可以查询副卡的哪些信息
- 10-05 如何修复 WINDOWS 11/10 中磁盘空间使
- 10-05 4 款最佳 Windows 11 声卡可供选择
- 10-05 如何在 Windows 10/11 上加速 Goo
- 10-05 什么是增值电信服务
- 10-05 电信卡的定向流量包括哪些软件?
- 10-05 电信app叫什么名字
- 10-05 什么是独立显卡直连?
- 10-05 独立显卡直连是什么意思?
- 10-05 为什么复制密码后打开淘宝不弹出弹窗?
- 10-05 PHP提高培训学校_php软件培训中心
- 10-05 vs创建项目跳回创建窗口_vs2017创建项目无法
- 最近发表