Инфикс в постфикс (cpp) - PullRequest
0 голосов
/ 29 марта 2020

Я собрал следующий код, чтобы преобразовать инфикс в постфикс. Однако это работает только тогда, когда инфикс заключен в скобки, и я понятия не имею, почему. Я пробовал много базовых c вещей, таких как прямое / косвенное присвоение значений.

Вот код

int prec(char c) 
{ 
    if(c == '^') 
    return 3; 
    else if(c == '*' || c == '/') 
    return 2; 
    else if(c == '+' || c == '-') 
    return 1; 
    else
    return -1; 
} 

class Expressions
{
    public:
    std::stack <char> inFix;
    std::stack <char> postFix;
    std::vector <char> postFixString;
    void ptInFix(); // prints the infix and deletes the stack, for testing only, need to tweak later
    void ptPostFix();
    void inFixtoPostFix();
};

void Expressions::inFixtoPostFix()
{
    int size = inFix.size();
    for(int i=0;i<size;i++)
    {
        if((inFix.top() >= 'a' && inFix.top() <= 'z')||(inFix.top() >= 'A' && inFix.top() <= 'Z'))
        {
            postFixString.push_back(inFix.top());
            inFix.pop();
        }
        else if(inFix.top() == '(')
        {
            postFix.push(inFix.top());
            inFix.pop();
        }

        else if(inFix.top() == ')')
        {
            while(postFix.top() != '(')
            {
                postFixString.push_back(postFix.top());
                postFix.pop();
            }
            if(postFix.top()=='(')
            {
                postFix.pop();
            }
            inFix.pop();
        }

        else if(inFix.top() == '^' || inFix.top() == '*' || inFix.top() == '/' || inFix.top() == '+' || inFix.top() == '-')
        {
            if(postFix.empty())
            {
                postFix.push(inFix.top());
                inFix.pop();
            }
            else if(postFix.empty()!=1)
            {
                while((prec(postFix.top())>=prec(inFix.top())))
                {   
                    char c = postFix.top();
                    postFix.pop();
                    postFixString.push_back(c);
                }
                postFix.push(inFix.top());
                inFix.pop();
            }
        }
    }

    int s = postFix.size();
    for(int i=0;i<s;i++)
    {
        postFixString.push_back(postFix.top());
        postFix.pop();
    }

}

И это работает

Expressions test;
    char infix[] = ("(A+B)*(C+D)");

    for(int i=(sizeof(infix)-1);i>=0;i--)
    {
        test.inFix.push(infix[i]);
    }

    test.inFixtoPostFix();

    std::cout<<"\n";

    for(int i=0; i<test.postFixString.size(); i++)
    {
        printf("%c ",test.postFixString[i]);
    }

    std::cout<<"\n";

Но это не делает, вообще ничего не выводит

Expressions test2;
    char infix2[] = ("A+B*C+D");

    for(int i=(sizeof(infix2)-1);i>=0;i--)
    {
        test2.inFix.push(infix2[i]);
    }

    test2.inFixtoPostFix();

    std::cout<<"\n";

    int s = test2.postFixString.size();

    for(int i=0; i<s; i++)
    {
        std::cout<<(test2.postFixString[i]) ;
    }

    std::cout<<"\n";

Так как каждый раз, когда я запускал второй тестовый случай, окно командной строки изучается, так что я подозреваю, что есть какая-то проблема с памятью, но не знаю, где. У меня было много выходов в реальной функции для отладки, но это не помогло, поэтому я удалил их для ясности.

...