My method is a little verbose. The hardest part is how to handle if the '-' is minus or a negative sign.
class Solution {
public:
int calculate(string s) {
stack<string> st;
int len=s.length();
stringstream ss;
for(int i=0;i<len;i++)
{
if(s[i]==' ')
continue;
if(s[i]=='(')
st.push("(");
else if(s[i]=='+')
st.push("+0");
else if(s[i]=='-')
st.push("-");
else if(s[i]>='0'&&s[i]<='9')
{
string e;
if(st.empty()||st.top()=="(")
st.push(e+s[i]);
else
st.top().push_back(s[i]);
}
else//s[i] is ')', do the calculation until a '('
{
int num1=0,num2=0;
while(1)
{
ss<<st.top();
ss>>num1;
ss.clear();
st.pop();
if(st.top()!="(")//() may contain only one number
{
ss<<st.top();
ss>>num2;
ss.clear();
st.pop();
}
string temp;
ss<<num1+num2;
ss>>temp;
ss.clear();
if(st.top()=="(")
{
st.pop();
if(!st.empty()&&st.top()=="-")
{
if(temp[0]=='-')
st.top()=temp.substr(1);
else
st.top()+=temp;
}
else
st.push(temp);
break;
}
st.push(temp);
}
}
}
while(st.size()>1)//no () int the stack any more, finish the rest calculation
{
int num1,num2;
ss<<st.top();
ss>>num1;
ss.clear();
st.pop();
ss<<st.top();
ss>>num2;
ss.clear();
ss<<num1+num2;
ss>>st.top();
ss.clear();
}
int res;
ss<<st.top();
ss>>res;
return res;
}
};