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

news/2024/7/19 12:58:33 标签: 华为od, python, java, c++, js

仿LISP运算

前言:本专栏将持续更新华为OD机试题目,并进行详细的分析与解答,包含完整的代码实现,希望可以帮助到正在努力的你。关于OD机试流程、面经、面试指导等,如有任何疑问,欢迎联系我,wechat:steven_moda;email:nansun0903@163.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_56">代码:python

python">import sys


def function():
    expression = input()
    num_stack = []
    operation_stack = []
    mark = 0
    param_one = 0
    param_two = 0

    for i in range(len(expression)):
        ch = expression[i]
        if ch == "(":
            operation_stack.append(expression[i+1: i+4])
            i += 4
            mark = i + 1
        elif ch == ")":
            if mark < i:
                num_stack.append(int(expression[mark: i]))
                i += 1
                mark = i + 1
            param_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 + 1

    while 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_stack


if __name__ == '__main__':
    function()

java_120">代码:java

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;    // 参数1
        int param_2 = 0;    // 参数2

        for (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 <iostream>
#include <stack>
#include <string>

using namespace std;

// 数字栈
stack<int> num_stack;

// 操作符栈
stack<string> opera_stack;

// 计算表达式(param_1 op param_2)的值
void calc(int param_1, int param_2) {
    string op = opera_stack.top();
    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; // 参数1
    int param_2 = 0; // 参数2

    for (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_stack.top();
            num_stack.pop();
            param_1 = num_stack.top();
            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_stack.top();
        num_stack.pop();
        param_1 = num_stack.top();
        num_stack.pop();
        calc(param_1, param_2);
    }

    return num_stack.top();
}

int main() {
    int ans = solution_01();
    cout << ans << endl;
    return 0;
}

js_305">代码:js

待更新…


http://www.niftyadmin.cn/n/1004978.html

相关文章

uniapp仿浙北惠生活微信小程序

最近给公司写了一个内部微信小程序&#xff0c;功能比较简单&#xff0c;之前是用微信小程序原声写的&#xff0c;一遍看文档一边写&#xff0c;js&#xff0c;wxml&#xff0c;wxcc&#xff0c;json分在不同文件的写法很不习惯&#xff0c;于是花了两天用uniapp重写了一遍&…

基于Python所写的影视作品分析设计

点击以下链接获取源码资源&#xff1a; https://download.csdn.net/download/qq_64505944/87964875 《开心麻花影视作品分析》程序使用说明 在PyCharm中运行《开心麻花影视作品分析》即可进入如图1所示的系统主界面。在该界面中&#xff0c;选择要分析的电影名称&#xff0c;然…

C#核心知识回顾——3.继承构造、拆装箱、多态

1.继承中的构造函数&#xff1a; 特点&#xff1a; 当申明一个子类对象时 先执行父类的构造函数&#xff0c;再执行子类的构造函数注意&#xff01;&#xff01;&#xff1a; 1.父类的无参构造很重要 2.子类可以通过base关键字代表父类调用父类构造 public class Mot…

Learn Mongodb DB功能命令索引等搜索 ⑤

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; PHP MYSQL &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &#x1f44…

Unity与Android交互(4)——接入SDK

【前言】 unity接入Android SDK有两种方式&#xff0c;一种是把Unity的工程导出google project的形式进行接入&#xff0c;另一种是通过把Android的工程做成Plugins的形式进行接入。我们接入SDK基本都是将SDK作为插件的形式接入的。 对我们接入SDK的人来说&#xff0c;SDK也是…

【力扣】集训总结

目录 一、前言二、收获三、建议 一、前言 陆陆续续做力扣题有一段时间了&#xff0c;从开始的绞劲脑汁也不会到现在略了解知晓怎么做。整体来说收获还是蛮大的&#xff0c;在一开始做题的时候还是有很多不会的&#xff0c;就像一道AB的问题就会做很久&#xff0c;但是没有关系…

Spring MVC相关注解运用 —— 上篇

目录 一、Controller、RequestMapping 1.1 示例程序 1.2 测试结果 二、RequestParam 2.1 示例程序 2.2 测试结果 三、RequestHeader、CookieValue 3.1 示例程序 3.2 测试结果 四、SessionAttributes 4.1 示例程序 4.2 测试结果 五、ModelAttribute 5.1 示例程序 …

mac ppt设置起始页码

今天发现我的ppt的左边ppt的缩略图的开始页码是从2开始的&#xff0c;觉得很奇怪&#xff0c;这个解决的办法就是 点击ppt->文件->页面设置->页眉和页脚->幻灯片编号