Advertisement
Marcvs7

calcoloespressionealgebrica

Aug 26th, 2013
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.68 KB | None | 0 0
  1. #include <iostream>
  2. #include <string.h>
  3. #include "evaluate.h"
  4.  
  5. using namespace std;
  6.  
  7. bool isAnOperator(char c){
  8.     if( (int(c) >= 42) && (int(c) <= 47) )
  9.         return true;
  10.     return false;
  11. }
  12.  
  13. void sizeStacks(string expression, int operatorStackSize = 0, int numberStackSize = 0){
  14.     int exprLenght = expression.size();
  15.     for( int i=0; i < exprLenght; i++ ){
  16.         if( isAnOperator(expression[i]) )
  17.             operatorStackSize++;
  18.         else if( expression[i] == '(' || expression[i] == ')' ){
  19.             //do nothing
  20.         }
  21.         else numberStackSize++;
  22.     }
  23. }
  24.  
  25. int evaluateExpression(string expression){
  26.     int opStSize = 0, numStSize = 0, result;
  27.     int exprLenght = expression.size();
  28.     sizeStacks(expression, opStSize, numStSize);
  29.     Stack<char> operatorStack(opStSize);
  30.     Stack<int> numberStack(numStSize);
  31.  
  32.     for(int i=0; i < exprLenght; i++){
  33.         if( isAnOperator(expression[i]) )
  34.             operatorStack.push(expression[i]);
  35.         else if( expression[i] == '(' ){
  36.             i++;
  37.             string bracketExpr;
  38.             while( expression[i] != ')' )
  39.                 bracketExpr += expression[i++];
  40.             bracketExpr = '\0';
  41.             numberStack.push(evaluateExpression(bracketExpr));
  42.         }
  43.         else numberStack.push(expression[i]);
  44.     }
  45.  
  46.     int num1Popped, num2Popped;
  47.     char operatorPopped;
  48.     while( !operatorStack.isEmpty() ){
  49.         numberStack.pop(num1Popped);
  50.         numberStack.pop(num2Popped);
  51.         operatorStack.pop(operatorPopped);
  52.         switch(operatorPopped){
  53.         case '+':
  54.             numberStack.push(num1Popped+num2Popped);
  55.             break;
  56.         case '-':
  57.             numberStack.push(num1Popped-num2Popped);
  58.             break;
  59.         case '*':
  60.             numberStack.push(num1Popped*num2Popped);
  61.             break;
  62.         case '/':
  63.             numberStack.push(num1Popped/num2Popped);
  64.             break;
  65.         }
  66.     }
  67.     return numberStack.pop(result);
  68. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement