#include<iostream>
#include<stack>
using namespace std;
bool evaluate(const char *expression, int &result);
int calculate( int value1, int value2, char operation);
int main()
{
int result = 0;
char input[100];
cout<<"Enter an algebraic expression to evaluate ";
cin>>input;
if (evaluate(input,result))
cout<<endl<<"The value of the evaluated expression is "<< result;
else
cout<<endl<<"Please enter a valid expression to evaluate";
}
bool evaluate(const char *expression, int &result)
{
stack<int> operands;
stack<char> operators;
while(*expression != '\0')
{
if(*expression == ' ')
{
*expression++;
continue;
}
else if(isdigit(*expression))
{
int number = 0;
while(isdigit(*expression))
{
number = number *10 + (*expression - '0') ;
*expression++;
}
operands.push(number);
}
else if(*expression == '(')
{
operators.push(*expression);
}
else if(*expression == '+' || *expression == '-' || *expression == '*' || *expression == '/')
{
operators.push(*expression);
}
else if(*expression == ')')
{
while(!operators.empty() && operators.top() != '(')
{
int value2 = operands.top();
operands.pop();
int value1 = operands.top();
operands.pop();
char op = operators.top();
operators.pop();
operands.push(calculate(value1, value2, op));
}
if(!operators.empty())
operators.pop();
}
else
{
return(false);
}
*expression++;
}
while(operands.size()!= 0)
{
int value2 = operands.top();
operands.pop();
int value1 = operands.top();
operands.pop();
char op = operators.top();
operators.pop();
operands.push(calculate(value1, value2, op));
}
return(true);
}
int calculate( int value1, int value2, char operation)
{
switch(operation){
case '+': return value1 + value2;
case '-': return value1 - value2;
case '*': return value1 * value2;
case '/': return value1 / value2;
}
}