题解 | #表达式求值#

表达式求值

https://www.nowcoder.com/practice/c215ba61c8b1443b996351df929dc4d4

#include <cctype>
#include <functional>
#include <vector>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 返回表达式的值
     * @param s string字符串 待计算的表达式
     * @return int整型
     */

    vector<int> function(string s,int index){
        stack<int> ms;
        int num=0;
        int i=0;
        char op = '+';
        for(i=index;i<s.size();i++){
            if(isdigit(s[i])){
                num = s[i]-'0'+ num*10 ;
c
            }
            if(s[i]=='('){
                vector<int> res = function(s, i+1);
                num = res[0];
                i=res[1];
                if(i!=s.size()-1) continue;
            }
            switch (op) {
                case '+':
                    ms.push(num);
                    break;
                case '-':
                    ms.push(-num);
                    break;
                case '*':
                    int temp = ms.top();
                    ms.pop();
                    ms.push(temp*num);
                    break;
            }
            num=0; 
            if(s[i]==')') break;
            else op=s[i];
        }
        int sum=0;
        while(!ms.empty()){
            sum+=ms.top();
            ms.pop();
        }
        return vector<int> {sum,i};
    }

    int solve(string s) {
        // write code here
        return function(s,0)[0];
    }
};

有一种延迟的思想。

一开始如果是数字,那么就会一直依靠sum=sum*10 + s[i]-'0'累加,并且保存在num里面。

如果运算符号是+or-,把num里面的数字push到栈里面,在下一个运算符号的时候进行计算;如果最后一个数字没有计算符号了,就不执行下面的语句,继续后续的operator此操作,完成+-*,再压入栈内。值得注意的是,乘法的实现需要先从栈里pop一个元素,与当前num相乘之后再push回去。

            if(i!=s.size()-1){
                continue;
            }

经过运算之后,栈内的元素进行相加就能得到最后的结果了。

以上部分没有考虑到小括号。小括号使用递归进行处理,当字符串中出现'('时,递归进入该函数计算,直到出现')'。其实我感觉'('和')'可以算作是一个运算符,负责得到一个新的num,这个时候应该跟出现符号的处理方式相同,即:如果不是最后一个字符,那么就到下个字符后压入栈内;若是最后一个字符,按前面的操作符号跟前面的栈元素进行运算。

全部评论

相关推荐

10-31 22:23
门头沟学院 Java
天然不是卷王:太好了 佬的金九银十结束,等offer吐出来,我的金11银12就要开始了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务