Python 逻辑运算

▼魔方 西西 提交于 2020-01-20 10:10:11

常用的逻辑运算有And(表示为&),Or(表示为|),Not(表示为!),他们的逻辑是:
1&1=1 1&0=0 0&1=0 0&0=0
1|1=1 1|0=1 0|1=1 0|0=0
!0=1 !1=0
其中,他们的优先关系为:Not(!)>And(&)>Or(|);
例如:
A|B&C 实际是 A(B&C)
A&B|C&D 实际是 (A&B)|(C&D)
!A&B|C 实际是 ((!A)&B)|C
输入描述
1.测试用例中间无空格,无需考虑空格
2.测试用例表示式中只会出现如下字符:
0,1,(,),&,|,!
3.测试用例所给的输入输出都是合法的。无需考虑非法输入。
4.测试用例表达式长度不会超过128个字符。
5.括号可以嵌套。
例如:
1|(1&0) = 1
1&0|0&1 = 0
!0&1|0 = 1
((!0&1))|0 = 1

import time

def logic(string):
    str = []
    while string.count(")") > 0:  #消除字符串中的括号
        if string[0] != ")":
            str.append(string[0])
            string = string[1:]
        else:
            string = string[1:]
            temp = []
            while str[-1] != "(":
                temp.insert(0, str.pop())
            str.pop()
            str.append(logic1(temp))
    while len(string) > 0:  #对括号全被消除后的字符串进行整理
        str.append(string[0])
        string = string[1:]

    return logic1(str)

#对不含括号的字符串进行逻辑运算
def logic1(alist):
    while len(alist) > 1:
        k = 0   #计算"!"运算符
        while "!" in alist:
            if alist[k] == "!":
                alist.pop(k)
                alist[k] = 1 - int(alist[k])
            k += 1

        k = 1   #计算"&"运算符
        while "&" in alist:
            if alist[k] == "&":
                alist.pop(k)
                alist[k-1] = int(alist[k-1]) * int(alist[k])
                alist.pop(k)
            else:
                k += 1

        k = 1   #计算"|"运算符
        while "|" in alist:
            if alist[k] == "|":
                alist.pop(k)
                alist[k-1] = (1 - (1 - int(alist[k-1])) * (1 - int(alist[k])))
                alist.pop(k)
            else:
                k += 1

    return alist[0]

if __name__ == "__main__":
    start_time = time.time()
    print(logic("1|(1&0)"))
    print(logic("1&0|0&1"))
    print(logic("!0&1|0"))
    print(logic("((!0&1))|0"))
    end_time = time.time()
    print(end_time - start_time)

在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!