Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string.h>
- #include "evaluate.h"
- using namespace std;
- bool isAnOperator(char c){
- if( (int(c) >= 42) && (int(c) <= 47) )
- return true;
- return false;
- }
- void sizeStacks(string expression, int operatorStackSize = 0, int numberStackSize = 0){
- int exprLenght = expression.size();
- for( int i=0; i < exprLenght; i++ ){
- if( isAnOperator(expression[i]) )
- operatorStackSize++;
- else if( expression[i] == '(' || expression[i] == ')' ){
- //do nothing
- }
- else numberStackSize++;
- }
- }
- int evaluateExpression(string expression){
- int opStSize = 0, numStSize = 0, result;
- int exprLenght = expression.size();
- sizeStacks(expression, opStSize, numStSize);
- Stack<char> operatorStack(opStSize);
- Stack<int> numberStack(numStSize);
- for(int i=0; i < exprLenght; i++){
- if( isAnOperator(expression[i]) )
- operatorStack.push(expression[i]);
- else if( expression[i] == '(' ){
- i++;
- string bracketExpr;
- while( expression[i] != ')' )
- bracketExpr += expression[i++];
- bracketExpr = '\0';
- numberStack.push(evaluateExpression(bracketExpr));
- }
- else numberStack.push(expression[i]);
- }
- int num1Popped, num2Popped;
- char operatorPopped;
- while( !operatorStack.isEmpty() ){
- numberStack.pop(num1Popped);
- numberStack.pop(num2Popped);
- operatorStack.pop(operatorPopped);
- switch(operatorPopped){
- case '+':
- numberStack.push(num1Popped+num2Popped);
- break;
- case '-':
- numberStack.push(num1Popped-num2Popped);
- break;
- case '*':
- numberStack.push(num1Popped*num2Popped);
- break;
- case '/':
- numberStack.push(num1Popped/num2Popped);
- break;
- }
- }
- return numberStack.pop(result);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement