• 【华为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 

    思路:

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

    代码:

    1. #include
    2. using namespace std;
    3. string val(int a, int b, string type) {
    4. if (type == "+")
    5. return to_string(a + b);
    6. if (type == "-")
    7. return to_string(a - b);
    8. if (type == "*")
    9. return to_string(a * b);
    10. if (type == "/") {
    11. if (b == 0)
    12. return "error";
    13. return to_string(a / b);
    14. }
    15. }
    16. int main() {
    17. string str;
    18. int i, j, a, b;
    19. stack s;
    20. getline(cin, str);
    21. for (i = 0; i < str.length(); i++) {
    22. if (str[i] == '(') {
    23. s.push("(");
    24. } else if (str[i] == 'a' ) {
    25. s.push("+");
    26. i += 2;
    27. } else if (str[i] == 's' ) {
    28. s.push("-");
    29. i += 2;
    30. } else if (str[i] == 'm' ) {
    31. s.push("*");
    32. i += 2;
    33. } else if (str[i] == 'd') {
    34. s.push("/");
    35. i += 2;
    36. } else if (str[i] == '-' || str[i] >= '0' && str[i] <= '9') {
    37. string ts = "";
    38. ts += str[i];
    39. for (j = i + 1; j < str.length(); j++) {
    40. if (str[j] >= '0' && str[j] <= '9')
    41. ts += str[j];
    42. else
    43. break;
    44. }
    45. //cout << "----ts:" << ts << endl;
    46. s.push(ts);
    47. i = j - 1;
    48. } else if (str[i] == ')') {
    49. string b = s.top();
    50. s.pop();
    51. string a = s.top();
    52. s.pop();
    53. string type = s.top();
    54. s.pop();
    55. s.pop();//抛出左括号
    56. //cout << "---pop():" << type << " " << a << " " << b << endl;
    57. string sum = val(stoi(a), stoi(b), type);
    58. if (sum == "error") {
    59. cout << "error" << endl;
    60. return 0;
    61. }
    62. s.push(sum);
    63. if (s.size() == 1) {
    64. cout << sum << endl;
    65. return 0;
    66. }
    67. }
    68. }
    69. return 0;
    70. }

  • 相关阅读:
    SpringBoot面试题2:SpringBoot与SpringCloud 区别?SpringBoot和Spring、SpringMVC的区别
    C语言:指针的基础详解
    【使用imgaug库调整图像大小并修改对应的XML标签框】
    SpringBoot介绍
    死锁的3种死法
    Effective Objective-C 学习(三)
    main.jsError: error:0308010C:digital envelope routines::unsupported
    多表操作-外键约束
    淘宝/天猫API:brand_cat-获取品牌分类列表
    python自动化测试平台开发:自动化测试平台简介
  • 原文地址:https://blog.csdn.net/Xylon_/article/details/133965631