Java中带真值表的调车场算法

Java中带真值表的调车场算法,java,algorithm,calculator,discrete-mathematics,truthtable,Java,Algorithm,Calculator,Discrete Mathematics,Truthtable,我正在为我的离散数学作业之一做一个真值表生成器。。我必须实现调车场算法,但我完全无法实现。我的问题是实现调车场算法。首先,我将展示我所查看的资源,然后是我的问题,然后是我启动的代码 我真正需要的是。。我知道这要求很多。但这是一个简化版的调车场算法。在维基百科示例中,当使用o1 o2等符号时,我会迷失在其中。我真正需要的是有人一步一步地解释如何应用它。我也不明白RPN符号是如何工作的。。但我现在可以读了 关闭码的实现: 维基百科关闭码算法: stackoverflow上的某人问题 基本实现

我正在为我的离散数学作业之一做一个真值表生成器。。我必须实现调车场算法,但我完全无法实现。我的问题是实现调车场算法。首先,我将展示我所查看的资源,然后是我的问题,然后是我启动的代码

我真正需要的是。。我知道这要求很多。但这是一个简化版的调车场算法。在维基百科示例中,当使用o1 o2等符号时,我会迷失在其中。我真正需要的是有人一步一步地解释如何应用它。我也不明白RPN符号是如何工作的。。但我现在可以读了

  • 关闭码的实现:
  • 维基百科关闭码算法:
  • stackoverflow上的某人问题
  • 基本实现
下面是一个输入示例:
A->B
(C)
:.F

我应该生成一个显示:
A-B-C-A->B-F
T-T-T--T--T
T-F-T--F--F
F-T-T--T--T
F-F-T--T--F
T-T-F--T--F
T-F-F--F--F
F-T-F--T--F
F-F-F--T--F

import java.util.Stack;
导入java.util.ArrayList;
公营停车场{
因此,私有静态final char='>';
私有静态最终字符和='&';
私有静态最终字符或=“|”;
公共静态字符串输入VersePolishNotation(字符串输入)
{
char[]tokens=input.toCharArray();
ArrayList输出=新的ArrayList();
Stack oppStack=新堆栈();
for(int i=0;i
我认为,您提到的给您带来麻烦的具体方面是:

  • 如果令牌是操作员o1,则:
    • 而在堆栈顶部有一个操作员令牌o2,以及
      • o1为左关联且其优先级小于或等于o2,或
      • o1的优先级低于o2
    • 将氧气从堆栈中弹出,进入输出队列
  • 将o1推到堆栈上
我认为在这件事上感到困惑是可以理解的。优先规则是RPN更容易解析的原因。在阅读时,请记住,“o1”是您正在阅读的运算符,“o2”是堆栈顶部的运算符

要处理它,您需要为运算符指定优先级值。如果我们讨论算术,例如,我可能会为优先级值指定
+
=1、
*
=2和
^
=3。如果正在读取的运算符的优先级低于或等于堆栈顶部的运算符,则从堆栈中弹出该运算符并将其传递给输出。这样做,直到您在堆栈上找到优先级低于读取运算符的运算符,或者不再在堆栈的(新)顶部找到运算符。不管怎样,您都会将read操作符推送到堆栈中

就整个事情的一步一步来说,维基百科的评论相当不错。请记住,定义的每个规则可能不适用于您的案例。根据您定义的标记判断,您似乎不需要担心函数和括号,因此可以将那里的算法简化为:

  • 虽然存在要读取的令牌:
    • 读一个令牌
    • 如果令牌是一个数字,则将其添加到输出队列中
    • 如果令牌是操作员o1,则:
      • 而在堆栈顶部有一个操作员令牌o2,以及 o1为左关联且其优先级小于或等于o2, 或者o1的优先级低于o2的优先级,
        • 将氧气从堆栈中弹出,进入输出队列
      • 将o1推到堆栈上
  • 当没有更多令牌可读取时:
    • 当堆栈中仍有操作员令牌时:
      • 将操作符弹出到输出队列中
  • 退出

即使您确实需要括号和函数,也可以从更简单的问题开始,并在问题解决后对其进行增强。

您链接到的Wikipedia文章有一个非常详细的分步描述,一个非常详细的分步示例,甚至是C语言的完全编码解决方案。不确定我们还能做什么。我同意worpet。不过,此链接可能会帮助您-->可视化调车场算法示例(将中缀转换为rpn)。转换为RPN后,如果表达式中有括号,则可以很容易地对其求值?请先在没有括号的情况下进行求值,使其正常工作。一旦这样做了,您就可以添加逻辑来处理它们。
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;
    }

}

}