Leetcode 227. 基本计算器 II

文章提供了三段不同的C++代码,解决LeetCode上的227题——基本计算器II。代码主要涉及数字解析、运算符处理以及使用accumulate函数进行累加计算。每段代码都对输入字符串中的数字和运算过程进行了处理,并将结果存储在栈中,最后通过accumulate求和得出计算结果。
摘要由CSDN通过智能技术生成

题目

在这里插入图片描述
Leetcode 227. 基本计算器 II

代码(首刷看解析)

这个题的解析用到了好多我不熟悉的函数

  • ·accumulate定义在#include中,作用有两个,一个是累加求和,另一个是自定义类型数据的处理。
    累加求和:int sum = accumulate(vec.begin() , vec.end() , 42);
    accumulate带有三个形参:头两个形参指定要累加的元素范围,第三个形参则是累加的初值。
    string sum = accumulate(v.begin() , v.end() , string(" "));

  • isdigit(char n):判断字符n是否在0~9

class Solution {
public:
    int calculate(string s) {
        int n = s.size();
        int num = 0;
        char preSign = '+';
        vector<int> stk;
        for(int i = 0; i < n; i++) {
            if(isdigit(s[i])) {
                num = num*10 + int(s[i]-'0');
            } 
            if (!isdigit(s[i]) && s[i] != ' ' || i == n - 1) {
                switch(preSign) {
                    case '+':
                        stk.push_back(num);
                        break;
                    case '-':
                        stk.push_back(-num);
                        break;
                    case '*':
                        stk.back() *= num;
                        break;
                    case '/':
                        stk.back() /= num;
                }
                preSign = s[i];
                num = 0;
            }
        }
        return accumulate(stk.begin(), stk.end(), 0);
    }
};

代码(9.9 二刷看解析)

class Solution {
public:
    int calculate(string s) {
        int num = 0;
        char pre = '+';
        vector<int> v;
        for(int i = 0; i < s.size(); i++) {
            if(isdigit(s[i])) {
                num = num*10 + int(s[i]-'0');
            } 
            if((s[i] != ' ' && !isdigit(s[i])) || i == s.size()-1) {
                if(pre =='+') {
                    v.push_back(num);
                } else if(pre == '-') {
                    v.push_back(-num);
                } else if(pre == '*') {
                    v.back() *= num;
                } else {
                    v.back() /= num;
                }
                pre = s[i];
                num = 0;
            }
        }
        return accumulate(v.begin(), v.end(), 0);
    }
};

代码(9.25 三刷看解析)

class Solution {
public:
    int calculate(string s) {
        int i = 0;
        vector<int> sk;
        int num = 0;
        char pre = '+'; // 第一个数是正的
        while(i < s.size()) {
            if(isdigit(s[i])) {
                num = num*10 + int(s[i]-'0');
            } 
            if((s[i] != ' ' && !isdigit(s[i])) || i == s.size()-1) {
                if(pre == '+') {
                    sk.push_back(num);
                } else if(pre == '-') {
                    sk.push_back(-num);
                } else if(pre == '*') {
                    sk.back() *= num;
                } else {
                    sk.back() /= num;
                }
                pre = s[i];
                num = 0;
            }
            i++;
        }
        return accumulate(sk.begin(), sk.end(), 0);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值