#include <iostream>
#include <stack>
#include <string>
#include <cctype>
using namespace std;
class infix_to_postfix 
{
protected:
    string exp;
    string infixexp;
    stack<char> charstack;
    bool prcd(char a, char b) 
    {
        return a > b;
    }
   public:
            infix_to_postfix(string str) 
            {
                 exp = str;
            }
            void push_to_stack() 
            {
                  for(int i = 0; exp[i]; ++i) 
                  {
                         if(exp[i] == ' ') 
                             continue;
                   if(isalnum(exp[i])) 
                   {
                         infixexp += exp[i];
                   }
             else 
             {
                      while(!charstack.empty() && prcd(exp[i], charstack.top())) 
                      {
                              infixexp += charstack.top();
                               charstack.pop();
                      }
                              charstack.push(exp[i]);
             }
        }
        while(!charstack.empty()) 
        {
            infixexp += charstack.top();
            charstack.pop();
        }
    }
    string print() 
    {
        return infixexp;
    }
    
};
class evaluate {
public:
    evaluate(string str) 
    {
        exp = str;
    }
    void peform() 
    {
        int res;
        for(int i = 0; i < exp.length(); i++) 
        {
            if(isalnum(exp[i])) 
            {
                nums.push(exp[i] - '0');
            }
            else 
            {
                if(!nums.empty()) 
                {
                    int a = nums.top();
                    nums.pop();
                    int b = nums.top();
                    nums.pop();
                    res = doit(b, exp[i], a);
                }
                nums.push(res);
            }
        }
    }
    int retres() 
    {
        return nums.top();
    }
protected:
    string exp;
    stack<int> nums;
private:
    int doit(int a, char c, int b) 
    {
        switch(c) 
        {
        case '+':
            return a + b;
            break;
        case '-':
            return a - b;
            break;
        case '*':
            return a * b;
            break;
        case '/':
            return a / b;
            break;
        }
    }
};
int main() 
{
    string infixstr;
    infix_to_postfix itop("5 * 2 + 3 * 1 - 9");
    itop.push_to_stack();
    infixstr = itop.print();
    cout << infixstr << endl;
    evaluate ev(infixstr);
    ev.peform();
    int res = ev.retres();
    cout << res << endl;
    return 0;
}
 
No comments:
Post a Comment