I need help with RPN notation!!!

• 04-08-2007
schnoor22
I need help with RPN notation!!!
Hi,
I'm currently working on a program that converts infix notation to postfix notation, then calculates the postfix notation. I was successful in the conversion, but I can't get the calculation to work. Below is my code, can someone please help, I've been working on this for hours!

``` #include<iostream> using namespace std; /*-------------------- Stack class ----------------------*/ template<class T> class Stack {   private:       int size;       int top;       T *arrayptr;   public:       Stack(int=20);       bool Push(T);       T Pop();       bool isfull();       bool isempty(); }; template<class T> Stack<T> :: Stack(int s) {   size = s > 0?s:20;   top = -1;   arrayptr = new T[size]; } template<class T> bool Stack<T> :: Push(T val) {   if(!isfull()){       arrayptr[++top]=val;       return true;}   return false; } template<class T> T Stack<T> :: Pop() { return arrayptr[top--]; } template<class T> bool Stack<T>::isfull() {   return top == size-1; } template<class T> bool Stack<T>::isempty() {   return top == -1; } void eVal(char *str,Stack<char> s,int siz); /*------------------------ main --------------------------*/ int main() {   Stack<char> s1;   int sizestr;   char string[20];   cout << "Enter an infix expression: ";   cin >> string;   sizestr = strlen(string);     cout << "The RPN Notation is: ";   eVal(string,s1,sizestr);   system("PAUSE");   return EXIT_SUCCESS; } /*----------------------- eVal ---------------------------*/ void eVal(char *str,Stack<char> s,int siz) {   char pop1;   char str2[20];   for(int i = 0;i < siz;i++)   {       if(str[i] > '0' && str[i] <= '9')           {           cout << str[i];                   str2[i] = str[i];           }       else if(str[i] == '*')       {           if(s.isempty())           {               s.Push(str[i]);           }           else           {               pop1 = s.Pop();               if(pop1 == '(')               {                   s.Push(pop1);                   s.Push(str[i]);               }               else if(pop1 == '*'|| pop1 =='/')               {                                   str2[i] = pop1;                   cout << pop1;                   s.Push(str[i]);               }               else if(pop1 == '+' || pop1 == '-')               {                   s.Push(pop1);                   s.Push(str[i]);               }           }       }       else if(str[i] == '/')       {           if(s.isempty())           {               s.Push(str[i]);           }           else           {               pop1 = s.Pop();               if(pop1 == '(')               {                   s.Push(pop1);                   s.Push(str[i]);               }               else if(pop1 == '*' || pop1 == '/')               {                                   str2[i] = pop1;                   cout << pop1;                   s.Push(str[i]);               }               else if(pop1 == '+' || pop1 == '-')               {                   s.Push(pop1);                   s.Push(str[i]);               }           }       }       else if(str[i] == '+')       {           if(s.isempty())           {               s.Push(str[i]);           }           else           {               pop1 = s.Pop();               if(pop1 == '(')               {                   s.Push(pop1);                   s.Push(str[i]);               }               else if(pop1 == '*' || pop1 == '/' || pop1 == '+' || pop1 == '-')               {                                          str2[i] = pop1;                   cout << pop1;                   s.Push(str[i]);               }           }       }       else if(str[i] == '-')       {           if(s.isempty())           {               s.Push(str[i]);           }           else           {               pop1 = s.Pop();               if(pop1 == '(' )               {                   s.Push(pop1);                   s.Push(str[i]);               }               else if(pop1 == '*' || pop1 == '/' || pop1 == '+' || pop1=='-')               {                                   str2[i] = pop1;                   cout << pop1;                   s.Push(str[i]);               }           }       }       else if(str[i] == '(')           s.Push(str[i]);       else if(str[i] == ')')       {           pop1 = s.Pop();           while(pop1 != '(')           {                           str2[i] = pop1;               cout << pop1;               pop1 = s.Pop();           }       }   }  while(!s.isempty())  {     cout << s.Pop();  }  cout << endl;  int left, right;  char type;  int convert;  for(i = 0;i < siz;i++)  {         type = str2[i];         if (isdigit(type))         {                 convert = str2[i] - '0';                 i = convert;                 s.Push(str2[i]);         }         else         {                 switch(type)                 {                         case '+':                                 s.Push(s.Pop() + s.Pop());                                 break;                         case '-':                                 right = s.Pop();                                 left = s.Pop();                                 s.Push(left - right);                                 break;                         case '*':                                 s.Push(s.Pop() * s.Pop());                                 break;                         case '/':                                 right = s.Pop();                                 left = s.Pop();                                 s.Push(left / right);                                 break;                         default:                                 throw domain_error("Undefined operator");                 }         }  } cout << "Result: " << str2[0] << str2[1] << str2[2] << str2[3] << str2[4] <<  endl; }```