Konwersja z wyrażenia infix na postfix (C ++) za pomocą stosów

Mój wykładowca przydzielił mi zadanie utworzenia programu do konwersji i infiksowania wyrażenia na postfix przy użyciu stosów. Zrobiłem klasy stosu i niektóre funkcje do odczytu wyrażenia infix.

Ale ta jedna funkcja, zwanaconvertToPostfix(char * const inFix, char * const postFix) który jest odpowiedzialny za konwersję wyrażenia inFix w tablicy inFix do wyrażenia post fix w tablicy postFix za pomocą stosów, nie robi tego, co ma robić. Czy możecie mi pomóc i powiedzieć, co robię źle?

Poniżej znajduje się kod, w którym funkcje do konwersji z inFix na postFix są iconvertToPostfix(char * const inFix, char * const postFix) potrzebuję pomocy przy naprawianiu:

 void ArithmeticExpression::inputAndConvertToPostfix()
    {
       char inputChar; //declaring inputChar
       int i = 0; //inizalize i to 0

       cout << "Enter the Arithmetic Expression(No Spaces): ";

       while( ( inputChar = static_cast<char>( cin.get() ) ) != '\n' )
       {
          if (i >= MAXSIZE) break; //exits program if i is greater than or equal to 100

          if(isdigit(inputChar) || isOperator(inputChar))
          {
             inFix[i] = inputChar; //copies each char to inFix array
             cout << inFix[i] << endl;
          }
          else
             cout << "You entered an invalid Arithmetic Expression\n\n" ;

          }

          // increment i;
          i++;
          convertToPostfix(inFix, postFix);


       }




    bool ArithmeticExpression::isOperator(char currentChar)
    {

        if(currentChar == '+')
            return true;
        else if(currentChar == '-')
            return true;
        else if(currentChar == '*')
            return true;
        else if(currentChar == '/')
            return true;
        else if(currentChar == '^')
            return true;
        else if(currentChar == '%')
            return true;
        else
            return false;
    }

    bool ArithmeticExpression::precedence(char operator1, char operator2)
    {
        if ( operator1 == '^' )
           return true;
        else if ( operator2 == '^' )
           return false;
        else if ( operator1 == '*' || operator1 == '/' )
           return true;
        else if ( operator1 == '+' || operator1 == '-' )
           if ( operator2 == '*' || operator2 == '/' )
              return false;
           else
              return true;

        return false;
    }

   void ArithmeticExpression::convertToPostfix(char * const inFix, char * const postFix)
        {
           Stack2<char> stack;

           const char lp = '(';

           stack.push(lp); //Push a left parenthesis ‘(‘ onto the stack.

           strcat(inFix,")");//Appends a right parenthesis ‘)’ to the end of infix.

          // int i = 0;
           int j = 0;

           if(!stack.isEmpty())
           {

               for(int i = 0;i < 100;){

                   if(isdigit(inFix[i]))
                   {
                        postFix[j] = inFix[i];
                        cout << "This is Post Fix for the first If: " << postFix[j] << endl;
                        i++;
                        j++;
                   }

                    if(inFix[i] == '(')
                   {
                       stack.push(inFix[i]);
                       cout << "The InFix was a (" << endl;
                       i++;
                       //j++;
                   }

                    if(isOperator(inFix[i]))
                               {
                            char operator1 = inFix[i];

                            cout << "CUrrent inFix is a operator" << endl;
                                   if(isOperator(stack.getTopPtr()->getData()))
                                       {
                                       cout << "The stack top ptr is a operator1" << endl;
                                       char operator2 = stack.getTopPtr()->getData();
                                           if(precedence(operator1,operator2))
                                           {
                                               //if(isOperator(stack.getTopPtr()->getData())){
                                                   cout << "The stack top ptr is a operato2" << endl;
                                                   postFix[j] = stack.pop();
                                                   cout << "this is post fix " << postFix[j] << endl;
                                                   i++;
                                                   j++;
                                              // }

                                           }

                                       }
                                   else

                                       stack.push(inFix[i]);
                                   // cout << "Top Ptr is a: "<< stack.getTopPtr()->getData() << endl;



                               }

                    for(int r = 0;r != '\0';r++)
                        cout << postFix[r] << " ";

                        if(inFix[i] == ')')
                       {
                           while(stack.stackTop()!= '(')
                         {
                               postFix[j] = stack.pop();
                               i++;
                               j++;
                                }
                           stack.pop();

                            }
                       }
           }

                   }

Zauważ, że funkcja convertToPostfix została wykonana przy użyciu tego algorytmu:

Wciśnij lewy nawias „(„ ”na stos.Dołącz prawy nawias „)’ do końca infix.

Podczas gdy stos nie jest pusty, przeczytaj infix od lewej do prawej i wykonaj następujące czynności:

Jeśli bieżącym znakiem w infix jest cyfra, skopiuj go do następnego elementu postfixa.Jeśli bieżący znak w infixie to lewy nawias, wciśnij go na stos.

Jeśli aktualna postać w infix jest operatorem,

Pop (operator) (jeśli istnieją) na szczycie stosu, gdy mają one równy lub wyższy priorytet niż bieżący operator, i wstawiane wyskakujące operatory w postfixie.Wciśnij bieżącą postać w stos na stosie.Jeśli bieżący znak w infixie jest prawym nawiasemPop operator z góry stosu i wstaw je do postfixa, aż lewy nawias znajdzie się na górze stosu.Pop (i odrzuć) lewy nawias ze stosu.

questionAnswers(5)

yourAnswerToTheQuestion