【华为OD机试】仿 LISP 运算

编程入门 行业动态 更新时间:2024-10-18 22:31:16

【<a href=https://www.elefans.com/category/jswz/34/1769368.html style=华为OD机试】仿 LISP 运算"/>

【华为OD机试】仿 LISP 运算

题目

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

题目涉及数字均为整数,可能为负;

不考虑 32 位溢出翻转,计算过程中也不会发生 32 位溢出翻转,

除零错误时,输出 “error”,

除法遇除不尽,向下取整,即 3/2 = 1 

思路:

将字符串中的括号、计算类型、数值依次拆分出来,然后基于栈的方法依次放入元素,遇到右括号的时候就进行一次计算,之后抛出括号内的元素再将计算后的结果放入栈,直到栈里只有一个元素,就是结果了

代码:

#include<bits/stdc++.h>
using namespace std;string val(int a, int b, string type) {if (type == "+")return to_string(a + b);if (type == "-")return to_string(a - b);if (type == "*")return to_string(a * b);if (type == "/") {if (b == 0)return "error";return to_string(a / b);}
}int main() {string str;int i, j, a, b;stack<string> s;getline(cin, str);for (i = 0; i < str.length(); i++) {if (str[i] == '(') {s.push("(");} else if (str[i] == 'a' ) {s.push("+");i += 2;} else if (str[i] == 's' ) {s.push("-");i += 2;} else if (str[i] == 'm' ) {s.push("*");i += 2;} else if (str[i] == 'd') {s.push("/");i += 2;} else if (str[i] == '-' || str[i] >= '0' && str[i] <= '9') {string ts = "";ts += str[i];for (j = i + 1; j < str.length(); j++) {if (str[j] >= '0' && str[j] <= '9')ts += str[j];elsebreak;}//cout << "----ts:" << ts << endl;s.push(ts);i = j - 1;} else if (str[i] == ')') {string b = s.top();s.pop();string a = s.top();s.pop();string type = s.top();s.pop();s.pop();//抛出左括号//cout << "---pop():" << type << " " << a << " " << b << endl;string sum = val(stoi(a), stoi(b), type);if (sum == "error") {cout << "error" << endl;return 0;}s.push(sum);if (s.size() == 1) {cout << sum << endl;return 0;}}}return 0;
}

更多推荐

【华为OD机试】仿 LISP 运算

本文发布于:2023-12-05 21:43:43,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1665394.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:华为   OD   LISP   机试

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!