Что самый легкий путь состоит в том, чтобы вычислить инфиксное выражение с помощью языка C?

Предположим вводы данных пользователем инфиксное выражение как строка? Что могло быть самым легким (Самым легким, я имею в виду самое короткое), способ оценить результат того выражения с помощью языка C?

Вероятные пути преобразовывают его в постфикс затем при помощи стеков. Но скорее долгий процесс. Есть ли какой-либо способ использовать функции, такие как atoi () или оценка (), который мог сделать задание легче?

16
задан Pete 30 July 2009 в 15:35
поделиться

6 ответов

вам нужно проанализировать строку. нет eval () в C (как и в большинстве статических языков), поэтому вам нужно либо написать свой собственный парсер, либо найти какую-нибудь библиотеку для помощи.

поскольку наиболее простые в использовании парсеры предназначены для C ++ и не C, я бы предпочел использовать полностью встраиваемый язык. Мне больше всего нравится Lua , который может быть невероятно легким, если вы не включите библиотеки. кроме того, синтаксис лучше, чем у C, поэтому вашим пользователям он может понравиться больше.

Конечно, Lua - это полноценный язык программирования, поэтому он может быть неуместным или может помочь другим способом (чтобы ваше приложение проще расширить).

2
ответ дан 30 November 2019 в 23:09
поделиться

Один чистый (возможно, не короткий) способ сделать это - построить дерево, как это сделал бы компилятор.

Например, скажем, у вас есть выражение «2 + 3». «+» Будет головой. «2» будет левым дочерним элементом, а «3» - правым ребенком.

Поскольку каждое выражение оценивается как значение, это дерево можно расширить для бесконечно сложных выражений: его просто нужно отсортировать в порядке приоритета для каждого оператора. Операторы с низким приоритетом (например, '+' идут вверху, а операторы с высоким приоритетом (например, '*') - внизу. Затем вы оцениваете выражения в дереве снизу вверх.

0
ответ дан 30 November 2019 в 23:09
поделиться

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

Взгляните на статью в Википедии о обратной польской нотации . Здесь показано, как выполнить преобразование и расчет.

0
ответ дан 30 November 2019 в 23:09
поделиться

Вам необходимо встроить интерпретатор некоторого языка сценариев.

0
ответ дан 30 November 2019 в 23:09
поделиться

Под самым простым, что вы подразумеваете под самым коротким, вы подразумеваете самый быстрый код? Если да, создайте строку и передайте ее другому процессу через popen или подобное. Если вам не нужен внешний процесс, вставьте интерпретатор lua, как предложил Хавьер. +1 Хавьеру, так как это, вероятно, то, что вы хотите.

-1
ответ дан 30 November 2019 в 23:09
поделиться

Безусловно, наиболее поучительный способ (и, возможно, даже самый простой, если вы знаете, как) - это научиться писать свои собственные рекурсивный анализатор спуска . Синтаксический анализатор для инфиксных выражений в C не очень длинный.

Вот одна из ряда отличных сообщений в блоге Эли Бендерски о синтаксическом анализе. (Этот вариант наиболее важен для вас, но я настоятельно рекомендую их всех.) Он содержит исходный код для синтаксического анализатора инфиксных выражений - по общему признанию, на Python, а не на C, но преобразование должно быть довольно простым, и вы ' Я многому научусь в процессе.

5
ответ дан 30 November 2019 в 23:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: