表达式求值

[题](表达式求值_牛客题霸_牛客网 (nowcoder.com))

  1. 代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70

    class Solution {
    public:
    /**
    * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
    * 返回表达式的值
    * @param s string字符串 待计算的表达式
    * @return int整型
    */
    vector<int> func(string str,int sub){
    int num=0;
    char op='+';//默认前面的数是+
    int i=sub;//设置值下表,用于递归
    int sum=0;//和
    vector<int> vector;//通过vector,返回sum,和下标
    stack<int> stack;//栈区存放数字
    for(;i<str.size();++i) {
    //下面的是,用于计算数字比如100,这样的多位数字
    if (isdigit(str[i])) {
    num = num * 10 + str[i] - '0';
    if (i != str.size() - 1) {
    continue;
    }
    }

    //递归标志
    if (str[i] == '(') {
    vector = func(str, ++i);
    //vector[0],用于存放sum
    //vector[1],用于存放下标
    num=vector[0];
    i=vector[1];
    if(i!=str.size()-1){
    continue;
    }
    }

    switch (op) {
    case '+':
    stack.push(num);
    break;
    case '-':
    stack.push(-num);
    break;
    case '*':
    num *= stack.top();
    stack.pop();
    stack.push(num);
    break;
    }
    num=0;
    if (str[i] == ')') {
    break;//递归结束的标志
    }else {
    op=str[i];
    }
    }
    //下面是求和的过程
    while(!stack.empty()){
    sum+=stack.top();
    stack.pop();
    }
    return ::vector<int>{sum,i};
    }

    int solve(string s) {
    // write code here
    return func(s,0).front();
    }
    };
  2. 提示

    采取栈加递归的方式

    如果是数字,根据前面的符号放进入栈区,如果是’+’,则直接放进去,如果是’-‘,就放入相反数,如果是’*’,就从栈区取出一个元素,然后计算。

    如果遇到(,当作递归的标志,进行递归(注意要设置下标)。

    如果像100,这样的多位数字,就应该进行数字的录入

  3. 理解

    • 采用func(),简化运算,方便调用
    • 使用vector,可以采用返回两个元素(sum,下标)
  4. 问题

    -


表达式求值
https://tsy244.github.io/2023/04/21/算法/newcoder/表达式求值/
Author
August Rosenberg
Posted on
April 21, 2023
Licensed under