Алгоритм маневровой станции с таблицами истинности в Java

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

То, что мне действительно нужно... Я знаю, что это требует многого. Но это упрощенная версия алгоритма маневровой станции. Я теряюсь по частям в примере из Википедии, когда используются обозначения, такие как o1 o2. Что мне действительно нужно, так это то, что кто-то объяснит шаг за шагом, как это применить. Я тоже не понимаю, как работает нотация RPN .. Но об этом я могу прочитать сейчас.

Вот пример ввода:
A -> B
(C)
:. Ф

Я должен сгенерировать ввод, который показывает:
ABCA->BF
TTT--T---T
TFT--F---F
FTT--T--- T
FFT--T---F
TTF--T---F
TFF--F---F
FTF--T---F
FFF- -Т---Ф

import java.util.Stack;
import java.util.ArrayList;

public class ShuttingYard{

private static final char THEREFORE = '>';
private static final char AND       = '&';
private static final char OR        = '|';


public static String inputToReversePolishNotation(String input)
{

    char[] tokens = input.toCharArray();
    ArrayList<String> output = new ArrayList<String>();
    Stack<String> oppStack = new Stack<String>();

    for(int i = 0; i < tokens.length; i++)
    {

    }

    return null;

}

public static boolean isLogicOperator(char input)
{

    switch(input)
    {
        case THEREFORE:
            return true;
        case AND:
            return true;
        case OR:
            return true;
        default:
            return false;
    }

}

}

person ryandawkins    schedule 25.01.2013    source источник
comment
Статья в Википедии, на которую вы ссылаетесь, содержит очень подробное пошаговое описание, очень подробный пошаговый пример и даже полностью закодированное решение на C. Не знаю, что еще мы можем сделать.   -  person worpet    schedule 26.01.2013
comment
Я согласен с worpet. Однако эта ссылка может вам помочь----› Преобразование инфикса в RPN (алгоритм маневровой станции)   -  person Smit    schedule 26.01.2013
comment
Пример визуализации алгоритма маневровой станции (преобразование инфикса в rpn). После преобразования в RPN выражение можно легко вычислить jsfiddle.net/7jh9f/2.   -  person Michael Buen    schedule 26.01.2013


Ответы (1)


Я полагаю, что конкретный момент, о котором вы упоминаете, вызывает у вас затруднения:

  • If the token is an operator, o1, then:
    • while there is an operator token, o2, at the top of the stack, and
      • either o1 is left-associative and its precedence is less than or equal to that of o2, or
      • o1 имеет меньший приоритет, чем o2,
    • вытолкнуть o2 из стека в выходную очередь;
  • поместить o1 в стек.

Я думаю, это понятно, что я запутался в этом произведении. Правила приоритета являются причиной того, что RPN предпочтительнее для простоты синтаксического анализа. При чтении просто помните, что «o1» — это оператор, который вы читаете, а «o2» — это оператор наверху стека.

Чтобы справиться с этим, вам нужно назначить значения приоритета ваших операторов. Если бы мы обсуждали арифметику, я мог бы, например, назначить + = 1, * = 2 и ^ = 3 для значений приоритета. Если оператору, который вы читаете, присвоен более низкий или равный приоритет с оператором на вершине стека, вы извлекаете оператор из стека и передаете его на выход. Делайте это до тех пор, пока не найдете в стеке оператор с более низким приоритетом, чем оператор чтения, или пока не перестанете находить оператор в (новой) вершине стека. Независимо от этого, вы затем поместите оператор чтения в стек.

Что касается пошагового описания всего этого, статья Википедии довольно хороша. Имейте в виду, что каждое определенное правило может не применяться к вашему делу. Судя по токенам, которые вы определили, похоже, вам не нужно беспокоиться о функциях и скобках, поэтому алгоритм можно упростить до:

  • While there are tokens to be read:
    • Read a token.
    • Если маркер представляет собой число, добавьте его в очередь вывода.
    • If the token is an operator, o1, then:
      • while there is an operator token, o2, at the top of the stack, and either o1 is left-associative and its precedence is less than or equal to that of o2, or o1 has precedence less than that of o2,
        • pop o2 off the stack, onto the output queue;
      • поместить o1 в стек.
  • When there are no more tokens to read:
    • While there are still operator tokens in the stack:
      • Pop the operator onto the output queue.
  • Выход.

Даже если вам нужны круглые скобки и функции, может помочь начать с более простой задачи и усовершенствовать ее, как только она заработает.

person femtoRgon    schedule 25.01.2013
comment
Если бы были скобки? - person ryandawkins; 26.01.2013
comment
Сначала сделайте это без них, заставьте это работать. Как только это произойдет, вы можете добавить логику для их обработки. - person femtoRgon; 26.01.2013