как писать в обратном направлении в 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;
};
Второй компонент преобразует это дерево синтаксического анализа в постфиксное выражение (выполняя то же самое, что и ваш исходный пост).
Третий компонент преобразует это дерево синтаксического анализа в префиксное выражение. Это просто рекурсивный процесс (для конкретного узла сначала выведите символ этого узла, затем рекурсивно примените его к левой стороне, а затем рекурсивно примените к правой стороне). Пожалуйста, дайте мне знать, если вам понадобятся дальнейшие инструкции о том, как это сделать.