Basic Calculator
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)" = 23Note: Do not use the
evalbuilt-in library function.
//(5), () valid?
//Step 1. convert to reverse polish notation
//Step 2. cal the reverse polish notation expression
//Can the operand overflow 32btis?
class Solution {
public:
int calculate(string s) {
vector<string> rpn;
long ans = 0;
stack<char> st;
stack<long> ist;
size_t i = 0;
while(i < s.size()){
char c = s[i];
if(c == ' ' || c == '\t'){
i++;
continue;
}
if(isOperator(c)){
// + - * /
//If stack is empty, push it
//If the priority of c is higher than the element on the top, or element on the top is '('', push it
//While the priority of c is lower or equal to the element on the top, pop stack to ans
if(st.empty()){
st.push(c);
i++;
}
else if(getPriority(c) > getPriority(st.top())){
st.push(c);
i++;
}
else{
rpn.push_back(string(1, st.top()));//BUG HERE, not to_string()
st.pop();
}
}
else if(isLeftParenthese(c)){
st.push(c);
i++;
}
else if(isRightParenthese(c)){
if(isLeftParenthese(st.top())){
st.pop();
i++;
}
else{
rpn.push_back(string(1, st.top()));//BUG HERE
st.pop();
}
}
else{
//operand, may be multiple digits "23"
int j = i;
while(isDigit(s[j]) && j < s.size()){
j++;
}
rpn.push_back(s.substr(i, j - i));
i = j;
}
}
//push the last operator in rpn string
while(st.empty() == false){
rpn.push_back(string(1, st.top()));//BUG HERE
st.pop();
}
//cal reverse polish notation
for(auto it = rpn.begin(); it != rpn.end(); it++){
string s = *it;
if(isDigit(s[0])){
long num = 0;
for(size_t i = 0; i < s.size(); i++){
num = num * 10 + s[i] - '0';
//i++; BUG HERE
}
ist.push(num);
}
else{
//operator
char c = (*it)[0];
long operand1 = ist.top();
ist.pop();
long operand2 = ist.top();
ist.pop();
long ans = 0;
switch(c){
case '+':
ans = operand2 + operand1;
break;
case '-':
ans = operand2 - operand1;
break;
case '*':
ans = operand2 * operand1;
break;
case '/':
ans = operand2 / operand1;
break;
}
ist.push(ans);
}
}
return ist.top();
}
bool isOperator(char c){
if(c == '-' || c == '+' || c == '*' || c == '/')
return true;
else{
return false;
}
}
bool isLeftParenthese(char c){
return c == '(';
}
bool isRightParenthese(char c){
return c == ')';
}
int getPriority(char c){
if(c == '*' || c == '/'){
return 2;
}
else if(c == '+' || c == '-'){
return 1;
}
else {
return 0;//left parenthese
}
}
bool isDigit(char c){
return c <= '9' && c >= '0';
}
};
