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 ;
}
};