Java中带真值表的调车场算法
我正在为我的离散数学作业之一做一个真值表生成器。。我必须实现调车场算法,但我完全无法实现。我的问题是实现调车场算法。首先,我将展示我所查看的资源,然后是我的问题,然后是我启动的代码 我真正需要的是。。我知道这要求很多。但这是一个简化版的调车场算法。在维基百科示例中,当使用o1 o2等符号时,我会迷失在其中。我真正需要的是有人一步一步地解释如何应用它。我也不明白RPN符号是如何工作的。。但我现在可以读了Java中带真值表的调车场算法,java,algorithm,calculator,discrete-mathematics,truthtable,Java,Algorithm,Calculator,Discrete Mathematics,Truthtable,我正在为我的离散数学作业之一做一个真值表生成器。。我必须实现调车场算法,但我完全无法实现。我的问题是实现调车场算法。首先,我将展示我所查看的资源,然后是我的问题,然后是我启动的代码 我真正需要的是。。我知道这要求很多。但这是一个简化版的调车场算法。在维基百科示例中,当使用o1 o2等符号时,我会迷失在其中。我真正需要的是有人一步一步地解释如何应用它。我也不明白RPN符号是如何工作的。。但我现在可以读了 关闭码的实现: 维基百科关闭码算法: stackoverflow上的某人问题 基本实现
- 关闭码的实现:
- 维基百科关闭码算法:
- 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
- 将氧气从堆栈中弹出,进入输出队列李>
- 而在堆栈顶部有一个操作员令牌o2,以及
- 将o1推到堆栈上
+
=1、*
=2和^
=3。如果正在读取的运算符的优先级低于或等于堆栈顶部的运算符,则从堆栈中弹出该运算符并将其传递给输出。这样做,直到您在堆栈上找到优先级低于读取运算符的运算符,或者不再在堆栈的(新)顶部找到运算符。不管怎样,您都会将read操作符推送到堆栈中
就整个事情的一步一步来说,维基百科的评论相当不错。请记住,定义的每个规则可能不适用于您的案例。根据您定义的标记判断,您似乎不需要担心函数和括号,因此可以将那里的算法简化为:
- 虽然存在要读取的令牌:
- 读一个令牌
- 如果令牌是一个数字,则将其添加到输出队列中
- 如果令牌是操作员o1,则:
- 而在堆栈顶部有一个操作员令牌o2,以及
o1为左关联且其优先级小于或等于o2,
或者o1的优先级低于o2的优先级,
- 将氧气从堆栈中弹出,进入输出队列李>
- 将o1推到堆栈上
- 而在堆栈顶部有一个操作员令牌o2,以及
o1为左关联且其优先级小于或等于o2,
或者o1的优先级低于o2的优先级,
- 当没有更多令牌可读取时:
- 当堆栈中仍有操作员令牌时:
- 将操作符弹出到输出队列中
- 当堆栈中仍有操作员令牌时:
- 退出
即使您确实需要括号和函数,也可以从更简单的问题开始,并在问题解决后对其进行增强。您链接到的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;
}
}
}