需要一个将命题逻辑表达式从中缀转换为后缀的算法吗

2024-05-16 21:36:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要一个算法将命题逻辑表达式从中缀转换为后缀,这样我就可以将它们转换为表达式树。下面是一些我正在处理的命题逻辑表达式的例子。你知道吗

T型

((r^(~pvp))→(~pvp))

(电视节目)

将算术表达式的中缀转换为后缀是一个非常标准的数据结构教科书问题。但是,我还没有找到很多关于命题逻辑这种转换的资料。你知道吗

我试过使用下面链接中提供的算法

https://www.geeksforgeeks.org/stack-set-2-infix-to-postfix/

当我将算法应用到命题逻辑表达式时,它似乎不起作用。我的代码不断弹出一个空堆栈。我认为这可能与命题逻辑中的运算(与算术中的运算不同)没有优先级有关,所以我不确定如何处理这个问题。另外,我不知道处理NOT运算符(~)是否应该是一个特例,因为它是一元运算符,所有其他运算符都是二进制的。你知道吗

如果有人能推荐或描述一个算法,将中缀命题逻辑表达式转换成后缀,我将非常感谢!非常感谢。你知道吗


Tags: 算法数据结构标准表达式链接运算符算术后缀
1条回答
网友
1楼 · 发布于 2024-05-16 21:36:32

您只需要实现一元运算符的正确解析。你知道吗

如果您不依赖于优先级,但总是将二进制中缀运算括在括号中,则可以简化该过程,因为这样就不需要使用带运算符的显式堆栈;调用堆栈将处理它们的顺序。你知道吗

下面是它的编码方式:

def inToPostFix(s):
    def reject(what): # Produce a readable error
        raise SyntaxError("Expected {}, but got {} at index {}".format(
            what or "EOF", 
            "'{}'".format(tokens[-1]) if tokens else "EOF", 
            len(s) - len(tokens)
        ))

    get = lambda: tokens.pop() if tokens else ""
    put = lambda token: output.append(token)
    match = lambda what: tokens[-1] in what if tokens else what == ""
    expect = lambda what: get() if match(what) else reject(what)

    def suffix():
        token = get()
        term()
        put(token)

    def parens(): 
        expect("(")
        expression(")")

    def term():
        if match(identifier): put(get())
        elif match(unary): suffix()
        elif match("("): parens()
        else: expect("an identifier, a unary operator or an opening parenthesis");

    def expression(terminator):
        term()
        if match(binary): suffix()
        expect(terminator)

    # Define the token groups
    identifier = "abcdefghijklmnopqrstuwxyz"
    identifier += identifier.upper()
    unary = "~";
    binary = "^v→";
    tokens = list(reversed(s)) # More efficient to pop from the end
    output = [] # Will be populated during the parsing
    expression("") # Parse!
    return "".join(output)

呼叫示例:

print(inToPostFix("(Tv~((p^(~qvq))))"))

请注意,在这里,当括号将整个表达式括起来时,可以省略括号。你知道吗

相关问题 更多 >