表达式求值(NC137/考察次数Top48/难度中等)

Posted 码农指南

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了表达式求值(NC137/考察次数Top48/难度中等)相关的知识,希望对你有一定的参考价值。

描述:
请写一个整数计算器,支持加减乘三种运算和括号。

示例1
输入:
“1+2”
返回值:
3
示例2
输入:
“(2*(3-4))*5”
返回值:
-10
(题目来自牛客网)

用C++实现如下

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 返回表达式的值
     * @param s string字符串 待计算的表达式
     * @return int整型
     */
    int solve(string s) {
        //思路,输入一串字符串,包含数字,加减乘除运算符以及括号等;
        //1.用栈保存各部分计算的和num;2.遍历表达式;3.遇到数字时继续遍历求出这个完整的数字的值
        //4.遇到左括号时,递归求出这个括号里面的表达式的值
        //+则直接push进去;-则push进去负的当前数;如果是*或者除,pop出一个运算数和当前数作计算,最后栈中结果求和即可
        stack<int> s1;
        int n=s.size();
        int result=0, num=0;                   // result存储最后结果; num存储当前的数字
        char flag= '+';
        for(int i = 0; i<n; i++)               //遍历所有的字符,用c来存储
        {
            char c=s[i];                       //取字符串的字符
            if(c >= '0' && c <= '9')           //如果为字符为数字
                num = num*10+c-'0';            //如果下一位还是数字字符则求实际的num,注意,字符数字可通过-'0'来变整型数
            if(c == '(')                       //如果是左括号,找到右括号,然后使用递归法进行求解
            {
                int j=i+1;                     //从当前位的下一位开始
                int count=1;                   //累计左括号的数量,要找到与第一个匹配的右括号
                while(count)
                {
                    if(s[j] == ')')
                        count--;
                    else if(s[j] == '(')
                        count++;
                    j++;                       //用于计算后面取字符串的长度
                }
                num = solve(s.substr(i+1, j-i-1));  //使用递归法进行求解,求出括号中的num
                i = j-1;
            }
            //一定要遇到运算符才说明此数结束了,才可以push,i==n-1用于处理最后一位(最后一位没有运算符)
            //要么后面还有运算符则push(说明此位置数已经结束),要么后面没有运算符push
            if(c == '+' || c == '-' || c == '*' || i == n-1)  
            {    
                if(flag == '+')
                    s1.push(num);             //为加法,直接把num放到stack里面
                if(flag == '-')
                    s1.push(-num);            //为减法,把-num放进去
                if(flag == '*')               //为乘法,顶部与其相乘,然后需要把顶部的元素弹出,然后放入相乘得到的结果值
                {
                    num*=s1.top();
                    s1.pop();
                    s1.push(num);
                }
                flag = c;                     //对flag完成一次更新
                num = 0;                      //完成了一次放入,num需要初始化为零一次
            }
        }
        while(!s1.empty())                    //将stack里面的数字,依次相加得到结果
        {
            result += s1.top();
            s1.pop();
        }
        return result;
    }
};

纯手撕代码,如果觉得内容不错麻烦点个赞,后面陆续配上Top100算法题通俗易懂的讲解视频,可以花两个月时间完全掌握,进大厂不是梦,转行狗亲测!

以上是关于表达式求值(NC137/考察次数Top48/难度中等)的主要内容,如果未能解决你的问题,请参考以下文章

最长公共前缀(NC55/考察次数Top64/难度简单)

最长公共前缀(NC55/考察次数Top64/难度简单)

缺失数字(NC101/考察次数Top60/难度简单)

缺失数字(NC101/考察次数Top60/难度简单)

数组中出现次数超过一半的数字(NC73/考察次数Top46/难度简单)

螺旋矩阵(NC38/考察次数Top27/难度入门)