LeetCode 227. 基本计算器 II

题目描述

实现一个基本的计算器来计算一个简单的字符串表达式的值。

字符串表达式仅包含非负整数,+, - ,*/ 四种运算符和空格  。 整数除法仅保留整数部分。

示例 1:

输入: "3+2*2"
输出: 7

示例 2:

输入: " 3/2 "
输出: 1

示例 3:

输入: " 3+5 / 2 "
输出: 5

说明:

  • 你可以假设所给定的表达式都是有效的。
  • 不要使用内置的库函数 eval

问题分析

此题还是用栈来解决。核心思想是将字符串拆分成一个个正数或负数,其中如果遇到乘法算式或者除法算式,那么将其算出结果后,将结果作为一个正数或负数放到原位置。最后把这些正数或负数都加起来,就得到结果了。遍历字符串,当遇到的字符是数字时,就用while循环把这个数整个找出来。如果遍历到的字符是加减乘除,或者此字符是字符串中的尾字符,那么如果是加减乘除则将该字符前面的数进行处理,或在当前字符是尾字符时把当前的数进行处理,并在处理后入栈。如果待被处理的数是一个单独的正数或者负数,即此时的sign为‘+’或者‘-’,那么将其压入栈;如果待被处理的数不是单独的数,即此时的sign为'*'或'/',那么我们需要将该乘式或除式算出来再压入栈。具体方法为把当前栈顶的数弹出,然后与当前待被处理的数num做乘除法,然后将结果压入栈。待被处理的数处理结束后,我们要将sign置为当前遍历到的符号c,然后将num置为0。如此进行当遍历完字符串后,字符串中的分结果都已经存入栈中了,所以我们把栈中的数都加起来得到ans然后返回即可。

代码实现

class Solution {
public:
    int calculate(string s) {
        int n = s.size();
        int ans = 0;
        int num = 0;
        stack<int> st;
        char sign = '+';
        for(int i = 0; i < n; i++){
            char c = s[i];
            if(c >= '0' && c <= '9'){
                while(i < n && s[i] >= '0' && s[i] <= '9'){
                    num = num * 10 + (s[i] - '0');
                    i++;
                }
                i--;
            }
            if(c == '+' || c == '-' || c == '*' || c == '/' || i == n - 1){
                if(sign == '+')
                    st.push(num);
                if(sign == '-')
                    st.push(-num);
                if(sign == '*' || sign == '/'){
                    int temp = (sign == '*'? st.top() * num : st.top() / num);
                    st.pop();
                    st.push(temp);
                }
                sign = c;
                num = 0;
            }
        }
        while(!st.empty()){
            ans += st.top();
            st.pop();
        }
        return ans;
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值