2015-05-12 2 views
0

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

(p & z => x) =>((p | d) & z)

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

Я разобрал разделение с запятой без каких-либо драм и теперь имеет вектор строк, содержащих каждый отдельный оператор, где каждая строка представлена ​​выше. Теперь, когда речь не идет о круглых скобках, я считаю, что определение этих высказываний будет довольно прямолинейным, но с их участием мне теперь необходимо рассчитать разные разделы перед другими. EG:

(p | d) = result, а затем (result & x)

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

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

+2

Вы не можете использовать алгоритм [шунтирующий двор] (http://en.wikipedia.org/wiki/Shunting-yard_algorithm) для этого? Он должен заботиться о параменоаях и о разном приоритете логических операторов. –

+0

@MOehm Я проверю его прямо сейчас, спасибо за ссылку. В ближайшее время я оставлю комментарий. – Stevo

+0

Вы можете построить двоичное дерево – Galik

ответ

1

Вам нужно построить дерево выражений, где ваши переменные - листья.

Ваше выражение станет тогда:

 => 
    /\ 
    / \ 
    / \ 
    =>  & 
/\ /\ 
    & X | Z 
/\ /\ 
p z P D 

После того, как вы создали этот вид представления, оценка очень проста.

Другой подход, с тем же результатом, уменьшает ваше выражение к чему-то вроде RPN (где вы можете использовать свой стек идею):

P, Z, &, X, =>, P, D, |, Z, &, => 

Как указывается в комментариях, вы можете сделать это с помощью шунтирования двоичный алгоритм.

+0

Спасибо за это, мне потребовалось несколько часов для обработки этой конкретной проблемы, но это было очень полезно. Я в конечном итоге пошел с методом RPN, который, похоже, сделал трюк довольно красиво.Одна из вещей, которые, как мне кажется, должны быть отмечены, заключается в том, что нет порядка операций в отношении логических операторов, поэтому он по существу в первую очередь приходит, сначала обслуживается (если не имеется круглых скобок). – Stevo

Смежные вопросы