224. Basic Calculator

Implement a basic calculator to evaluate a simple expression string.

The expression string may contain open ( and closing parentheses ), the plus + or minus sign -, non-negative integers and empty spaces .

You may assume that the given expression is always valid.

Some examples:

"1 + 1" = 2
" 2-1 + 2 " = 3
"(1+(4+5+2)-3)+(6+8)" = 23

Note: Do not use the eval built-in library function.

计算一个字符串,字符串中只有非负整数,加号,减号,和小括号。

因为没有乘除,所以这道题唯一的难点在于减号后面跟着小括号,因为小括号前面为减号时,小括号里面的运算符都要变号,于是想到一种方法,写一个函数parenthese(),碰到小括号'(' 时,自动进入小括号计算括号内的值,这是一个递归的过程。

举个例子:

3 + (2 - 5 - (5 + 9))

首先parenthese()计算(2 - 5 - (5 + 9)),在这个函数中,会调用自己计算(5 + 9),得到14,最终返回2 - 5 - 14为-17,所以最终的结果就是-14。

代码如下:

int parenthese(string s, int& i)
    {
        int result = 0;
        int sign = 1;
        for (i = i + 1; i < s.length(); i++)
        {
            if (s[i] == '+') { sign = 1; continue; }
            if (s[i] == '-') { sign = -1; continue; }
            if (s[i] == ' ')continue;
            if (s[i] == '(')
            {
                int temp = parenthese(s, i);
                result += sign * temp;
                continue;
            }
            if (s[i] == ')')break;
            int temp = s[i] - 48;
            for (i = i + 1; i < s.length(); i++)
            {
                if (s[i] < '0' || s[i] > '9') { i--; break; }
                temp = temp * 10 + s[i] - 48;
            }
            result += sign * temp;
        }
        return result;
    }
    int calculate(string s)
    {
        int result = 0;
        int sign = 1;
        for (int i = 0; i < s.length(); i++)
        {
            if (s[i] == ' ')continue;
            if (s[i] == '(')
            {
                int temp = parenthese(s, i);
                result += sign * temp;
                continue;
            }
            if (s[i] == '+') { sign = 1; continue; }
            if (s[i] == '-') { sign = -1; continue; }
            int temp = s[i] - 48;
            for (i = i + 1; i < s.length(); i++)
            {
                if (s[i] < '0' || s[i] > '9') { i--; break; }
                temp = temp * 10 + s[i] - 48;
            }
            result += sign * temp;
        }
        return result;
    }
采用栈的方式也可以实现:
int calculate(string s)
    {
        int result = 0;
        int sign = 1;
        stack<int> stk;
        for (int i = 0; i < s.length(); i++)
        {
            if (s[i] == ' ')continue;
            if (s[i] == '+') { sign = 1; continue; }
            if (s[i] == '-') { sign = -1; continue; }
            if (s[i] == '(')
            {
                stk.push(result);
                stk.push(sign);
                result = 0;
                sign = 1;
                continue;
            }
            if (s[i] == ')')
            {
                result *= stk.top();
                stk.pop();
                result += stk.top();
                stk.pop();
                continue;
            }
            int temp = s[i] - 48;
            for (i = i + 1; i < s.length(); i++)
            {
                if (s[i] < '0' || s[i] > '9') { i--; break; }
                temp = temp * 10 + s[i] - 48;
            }
            result += sign * temp;
        }
        return result;
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值