Почему я столкнулся с этой проблемой - Ошибка при запуске программы (ошибка сегментации) при создании программы для преобразования инфикса в префикс?

Я пытаюсь создать программу на C ++, которая преобразует инфикс в префикс, но когда я запускаю ее, она показывает мне эту ошибку «Ошибка запуска программы (ошибка сегментации)» . Ниже мой код. Логика идеальна, но когда я пытаюсь запустить ее с тестовым примером как ((a + bc) * d ^ e ^ f) / g, он показывает пустой результат.

      #include <iostream>
#include <stack>
#include <algorithm>
using namespace std;
int precedence(char c)
{
    if (c == '^')
    {
        return 3;
    }
    else if ((c == '*' || c == '/'))
    {
        return 2;
    }
    else if ((c == '+' || c == '-'))
    {
        return 1;
    }
    return -1;
}
bool isOperator(char c)
{
    if (c == '*' || c == '/' || c == '+' || c == '-' || c == '^')
    {
        return true;
    }
    return false;
}
string InfixToPrefix(stack<char> s, string infix)
{
    string prefix;
    reverse(infix.begin(), infix.end());
    for (int i = 0; i < infix.length(); i++)
    {
        if (infix[i] == '(')
        {
            infix[i] = ')';
        }
        else if (infix[i] == ')')
        {
            infix[i] = '(';
        }
    }
    for (int i = 0; i < infix.length(); i++)
    {
        if ((infix[i] >= 'a' && infix[i] <= 'z') || (infix[i] >= 'A' && infix[i] <= 'Z'))
        {
            prefix += infix[i];
        }
        else if (infix[i] == '(')
        {
            s.push(infix[i]);
        }
        else if (infix[i] == ')')
        {
            while (((s.top() != '(') && (!s.empty())))
            {
                prefix += s.top();
                s.pop();
            }
            if (s.top() == '(')
            {
                s.pop();
            }
        }
        else if (isOperator(infix[i]))
        {
            if (s.empty())
            {
                s.push(infix[i]);
            }
            else
            {
                if (precedence(infix[i]) > precedence(s.top()))
                {
                    s.push(infix[i]);
                }
                else if (((precedence(infix[i]) == precedence(s.top())) && (infix[i] == '^')))
                {
                    while (((precedence(infix[i]) == precedence(s.top())) && (infix[i] == '^')))
                    {
                        prefix += s.top();
                        s.pop();
                    }
                    s.push(infix[i]);
                }
                else if (precedence(infix[i]) == precedence(s.top()))
                {
                    s.push(infix[i]);
                }
                else if (precedence(infix[i]) < precedence(s.top()))
                {
                    while ((precedence(infix[i]) < precedence(s.top())) && (!s.empty()))
                    {
                        prefix += s.top();
                        s.pop();
                    }
                    s.push(infix[i]);
                }
            }
        }
        if (!s.empty())
        {
            prefix += s.top();
            s.pop();
        }
    }
    reverse(prefix.begin(), prefix.end());
    return prefix;
}
int main()
{
    string infix, prefix;
    stack<char> s;
    cin >> infix;
    prefix = InfixToPrefix(s, infix);
    cout << endl
         << prefix << endl;
    return 0;
}

0 ответов

Другие вопросы по тегам