leetcode 227. Basic Calculator II 字符串表达式计算+减乘除没有括号的表达式计算

Implement a basic calculator to evaluate a simple expression string.

The expression string contains only non-negative integers, +, -, *, / operators and empty spaces . The integer division should truncate toward zero.

You may assume that the given expression is always valid.

Some examples:
“3+2*2” = 7
” 3/2 ” = 1
” 3+5 / 2 ” = 5
Note: Do not use the eval built-in library function.

这道题就是最经典的字符串表达式的计算问题,可以先做中序转后序,然后去计算,可以参考上一道题leetcode 224. Basic Calculator 字符串表达式计算

代码如下:

import java.util.Stack;

public class Solution 
{
    public int calculate(String s)
    {
        int len;
        if(s==null || (len = s.length())==0) 
            return 0;

        Stack<Integer> stack = new Stack<Integer>();
        int num = 0;
        char sign = '+';
        for(int i=0;i<len;i++)
        {
            if(Character.isDigit(s.charAt(i)))
                num = num*10+s.charAt(i)-'0';

            if((!Character.isDigit(s.charAt(i)) &&' '!=s.charAt(i)) || i==len-1)
            {
                if(sign=='-')
                    stack.push(-num);

                if(sign=='+')
                    stack.push(num);

                if(sign=='*')
                    stack.push(stack.pop()*num);

                if(sign=='/')
                    stack.push(stack.pop()/num);

                sign = s.charAt(i);
                num = 0;
            }
        }

        int re = 0;
        for(int i:stack)
            re += i;

        return re;
    }
}

下面是C++的做法,就是做一个遍历,很不错的做法

注意for循环中的两个if是并列的

代码如下:

#include <iostream>
#include <vector>
#include <map>
#include <unordered_map>
#include <set>
#include <unordered_set>
#include <queue>
#include <stack>
#include <string>
#include <climits>
#include <algorithm>
#include <sstream>
#include <functional>
#include <bitset>
#include <numeric>
#include <cmath>
#include <regex>

using namespace std;



class Solution
{
public:
    int calculate(string s) 
    {
        if (s.length() <= 0)
            return 0;

        stack<int> skt;
        int num = 0;
        char sign = '+';
        for (int i = 0; i < s.length(); i++)
        {
            if (s[i] >= '0' && s[i] <= '9')
                num = num * 10 + (int)(s[i] - '0');

            if (!(s[i] >= '0' && s[i] <= '9') && s[i] != ' ' || i == s.length() - 1)
            {
                if (sign == '-')
                    skt.push(-num);
                else if (sign == '+')
                    skt.push(num);
                else if (sign == '*')
                {
                    int tmp = skt.top()*num;
                    skt.pop();
                    skt.push(tmp);
                }
                else if (sign == '/')
                {
                    int tmp = skt.top()/num;
                    skt.pop();
                    skt.push(tmp);
                }

                sign = s[i];
                num = 0;
            }
        }

        int res = 0;
        while (skt.empty() == false)
        {
            res += skt.top();
            skt.pop();
        }
        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值