LeetCode No.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.

==============================================================

题目链接:https://leetcode.com/problems/basic-calculator-ii/

题目大意:简单计算器,只包含+、-、*、/和括号()。

思路:先对操作符进行优先级判断,根据优先级使用栈对操作符进行操作。

代码适用性:适合+、-、*、/、()、小数

参考代码:

class Solution {
public:
    int calculate(string s) {
        int n = s.size();
        if ( n == 0 )
            return 0 ;
        vector <int> data ;//data
        vector <char> oprt ;//operator
        string num = "" ;
        for ( int i = 0 ; i < n ; i ++ )
        {
            if ( s[i] == '(' )
                oprt.push_back ( s[i] ) ;
            else if ( s[i] == ')' )
            {
                while ( oprt.back() != '(' )
                {
                    int b = data.back () ;
                    data.pop_back () ;
                    int a = data.back () ;
                    data.pop_back () ;
                    data.push_back ( cal ( a , b , oprt.back () ) ); 
                    oprt.pop_back() ;
                }
                oprt.pop_back () ;//pop '('
            }
            else if ( isdigit ( s[i] ) || s[i] == '-' && ( i == 0 || s[i-1] == '(' ) )//case -1 + 2.3 or case 2 * (-2 - 3)
    		{
    			num = "" ;
    			num += s[i] ;
    			while ( i + 1 < s.size() && ( s[i+1] == '.' || isdigit ( s[i+1] ) ) )
    			{
    				num += s[i+1] ;
    				i ++ ;
    			}
    			data.push_back ( atof ( num.c_str() ) ) ;
    		}
            else if ( s[i] != ' ' )
            {
                while ( ! oprt.empty() && priority ( oprt.back() ) >= priority ( s[i] ) )
                {
                    int b = data.back () ;
                    data.pop_back () ;
                    int a = data.back () ;
                    data.pop_back () ;
                    data.push_back ( cal ( a , b , oprt.back () ) ); 
                    oprt.pop_back() ;
                }
                oprt.push_back ( s[i] ) ;
            }
        }
        while ( ! oprt.empty() )
        {
            int b = data.back () ;
            data.pop_back () ;
            int a = data.back () ;
            data.pop_back () ;
            data.push_back ( cal ( a , b , oprt.back () ) ); 
            oprt.pop_back() ;
        }
        return data[0] ;
    }
private :
    int priority ( char ch )
    {
        if ( ch == '(' )
            return 0 ;
        if ( ch == '-' || ch == '+' )
            return 1 ;
        return 2 ;
    }
    int cal ( double a , double b , char ch )
    {
        if ( ch == '+' )
            return a + b ;
        else if ( ch == '-' )
            return a - b ;
        else if ( ch == '*' )
            return a * b ;
        return a / b ;
    }
};


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值