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.
==============================================================
题目链接:https://leetcode.com/problems/basic-calculator/
题目大意:简单计算器,只包含+、-和括号()。
思路:先对操作符进行优先级判断,根据优先级使用栈对操作符进行操作。
代码适用性:适合+、-、*、/、()、小数、负数
参考代码:
class Solution {
public:
int calculate(string s) {
int n = s.size();
if ( n == 0 )
return 0 ;
vector <double> 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() != '(' )//compute all operators behind '('
{
double b = data.back () ;
data.pop_back () ;
double 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] ) ) )// find data
{
num += s[i+1] ;
i ++ ;
}
data.push_back ( atoi ( num.c_str() ) ) ;// push num to data stack
}
else if ( s[i] != ' ' )// if it is an operator
{
while ( ! oprt.empty() && priority ( oprt.back() ) >= priority ( s[i] ) )// compute operator whose priority greater than this operator
{
double b = data.back () ;
data.pop_back () ;
double a = data.back () ;
data.pop_back () ;
data.push_back ( cal ( a , b , oprt.back () ) );
oprt.pop_back() ;
}
oprt.push_back ( s[i] ) ;// push back the operator
}
}
while ( ! oprt.empty() )// compute all operators in the stack
{
double b = data.back () ;
data.pop_back () ;
double 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 )// compute priority of an opertor
{
if ( ch == '(' )
return 0 ;
if ( ch == '-' || ch == '+' )
return 1 ;
return 2 ;// if ch == '*' or ch == '/'
}
double cal ( double a , double b , char ch )// calculate a (ch) b
{
if ( ch == '+' )
return a + b ;
else if ( ch == '-' )
return a - b ;
else if ( ch == '*' )
return a * b ;
return a / b ;
}
};