欢迎来到Introzo百科
Introzo百科
当前位置:网站首页 > 技术 > 【华为OD机试】仿LISP运算(python, java, c++, js)

【华为OD机试】仿LISP运算(python, java, c++, js)

日期:2023-09-27 09:57

仿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

待更新…

关灯