LeetCode No.227 Basic Calculator II

来源:互联网 发布:中央财经大学知乎 编辑:程序博客网 时间:2024/06/07 03:43

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
原创粉丝点击