как писать в обратном направлении в c

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

      while(*e != '\0')
    {
        if(isalpha(*e))
            printf("%c ",*e);
        else if(*e == '(')
            push(*e);
        else if(*e == ')')
        {
            while((x = pop()) != '(')
                printf("%c ", x);
        }
        else
        {
            while(priority(stack[top]) >= priority(*e))
                printf("%c ",pop());
            push(*e);
        }
        e++;
    }  

Выше часть инфикса к постфиксу, в котором eэто указатель, который просматривает строку. В инфиксе до pre я планирую заменить e ++ на e-- Но, как и в первых строках, мы видим, что он напрямую печатает char, поэтому мне нужно изменить направление
Eg.
а
ба
+ ба

1 ответ

Во-первых, добро пожаловать в stackoverflow. (Я тоже здесь новичок.)

На самом деле, ваш заголовок не совсем описывает то, что вам нужно: то есть «писать в обратном направлении» недостаточно для ваших целей.

Рассмотрим входное инфиксное выражение a + b * c. Вы выполнили подзадачу по преобразованию этого в постфикс как a b c * + (при условии приоритета * выше чем +). Правильное преобразование в префикс будет + a * b c. Обратите внимание, что это не то же самое, что обращение результата постфикса (т. Е. Это не + * c b a). В заключение, префиксное выражение - это не просто обращение постфиксного выражения.

Итак, как бы мне решить вашу задачу? Я бы создал систему из трех компонентов. Первый компонент обрабатывает ваш ввод и генерирует простое «дерево синтаксического анализа», которое графически представлено как:

        +  
 / \
a   *
   / \  
  b   c

Основная структура данных для этого - «узел дерева синтаксического анализа», который выглядит примерно так:

      struct Node {
    Node* leftChild;
    Node* rightChild;
    char symbol;
};

Второй компонент преобразует это дерево синтаксического анализа в постфиксное выражение (выполняя то же самое, что и ваш исходный пост).

Третий компонент преобразует это дерево синтаксического анализа в префиксное выражение. Это просто рекурсивный процесс (для конкретного узла сначала выведите символ этого узла, затем рекурсивно примените его к левой стороне, а затем рекурсивно примените к правой стороне). Пожалуйста, дайте мне знать, если вам понадобятся дальнейшие инструкции о том, как это сделать.

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