The problem can be solved by using two stacks. One for the numbers and another one for the operators. When we get a left parenthesis we ignore it. When we get an operand we push it to the number stack and when we get a operator, we push it to the operator stack. When we encounter a right parenthesis, we pop two elements from number stack, pop a operator from operator stack, perform operation on the numbers and push back the result to the number stack.
#include<iostream>
#include<stack>
using namespace std;
int main()
{
stack<int> val;
stack<char> op;
string expression;
cin>>expression;
for(int i=0;i<expression.length();i++)
{
if((expression[i] - '0' >=0) && (expression[i] - '0' <=9))
val.push(expression[i] - '0');
else if (expression[i] == '(')
continue;
else if (expression[i] == '-' || expression[i] == '+' || expression[i] == '*' || expression[i] == '/')
op.push(expression[i]);
else if(expression[i] == ')')
{
if (op.empty() || val.empty())
{
cout<<"InCorrect number of paranthesis "<<endl;
return -1;
}
else
{
int num1 = val.top();
val.pop();
if(val.empty())
{
cout<<"InCorrect number of paranthesis "<<endl;
return -1;
}
int num2 = val.top();
val.pop();
char oper = op.top();
op.pop();
switch(oper)
{
case '+' : val.push(num1 + num2);
break;
case '-' : val.push(num1 - num2);
break;
case '*' : val.push(num1*num2);
break;
case '/' : val.push(num1/num2);
break;
}
}
}
else
continue;
}
cout<<val.top()<<endl;
return 0;
}