华为2020届校园招聘上机笔试题(第三题)——逻辑运算计算器(Python实现)

题意大概为:

实现逻辑运算计算器功能,逻辑运算符: !(非)、|(或)、(与),其优先级为 !|。

case中只会出现0、1、(、)、!、、|,且无空格

这题的思路和四则运算计算器差不多,使用栈先将中缀表达式转化为后缀表达式,之后再对后缀表达式进行计算。只不过四则运算加上括号有三个运算优先级,而逻辑运算计算器加上括号则有四个优先级。所以再入栈弹栈时要注意优先级

def postfix_calcution(expression):
    """
    计算后缀表达式
    :param expression: 后缀表达式
    :return: 计算结果
    """
    stack = []
    for i in expression:
        if i.isnumeric():
            stack.append(int(i))  # 若为数字,则存入栈中
        else:
            if i == '':  # 若为操作符,从栈中弹出两个数字进行与运算,并将结果保存在在栈中
                a = stack.pop()
                b = stack.pop()
                result = a  b
            elif i == '|':  # 若为|操作符,从栈中弹出两个数字进行或运算,并将结果保存在在栈中
                a = stack.pop()
                b = stack.pop()
                result = a | b
            else:           # 若为!操作符,从栈中弹出一个数字进行非运算,并将结果保存在在栈中
                a = stack.pop()
                result = not a
            stack.append(result)
    # 计算完成后,最终的结果会保存在栈中,栈中只有一个元素。这里因为直接返回stack[0]会出现返回值为True和False的情况所以进行判断
    if stack[0] is True:   
        return 1
    elif stack[0] is False:
        return 0
    else:
        return stack[0]


def infix_to_postfix(expression):
    """
    将中缀表达式转化为后缀表达式
    :param expression: 中缀表达式
    :return: 后缀表达式
    """
    postfix_expression = []
    stack = []
    for i in expression:
        if i.isnumeric():
            postfix_expression.append(i)
        else:
            if not stack:
                stack.append(i)
            elif i in '(!':
                stack.append(i)
            elif i == '':
                if stack[len(stack) - 1] == '!':  # 若字符串为,先判断栈首是否为!,若是,则开始弹出
                    if stack.count('(') == 0:  # 栈中没有(,将栈中所有!弹出
                        a = stack.pop()
                        postfix_expression.append(a)
                        if stack:   # 此时栈有可能弹空,判断是否为空
                            while stack[len(stack) - 1] == '!':
                                a = stack.pop()
                                if stack:      # 此时栈有可能弹空,判断是否为空
                                    postfix_expression.append(a)
                                else:
                                    break
                    else:
                        a = stack.pop()
                        while a != '(':
                            postfix_expression.append(a)
                            a = stack.pop()
                        stack.append('(')
                    stack.append(i)
                else:
                    stack.append(i)
            elif i == '|':
                if stack[len(stack) - 1] in '!':
                    if stack.count('(') == 0:  # 栈中没有(,将栈中所有操作符弹出,添加到后缀表达式中
                        while stack:
                            postfix_expression.append(stack.pop())
                    else:                      # 栈中有(,将(前所有操作符弹出,添加到后缀表达式中,(不要弹出
                        a = stack.pop()
                        while a != '(':
                            postfix_expression.append(a)
                            a = stack.pop()
                        stack.append('(')
                    stack.append(i)
                else:
                    stack.append(i)
            elif i == ')':   # 若为),将栈中(前的所有操作符弹出添加到后缀表达式中,(也弹出,但是不添加到栈中
                a = stack.pop()
                while a != '(':
                    postfix_expression.append(a)
                    a = stack.pop()
    while stack:
        postfix_expression.append(stack.pop())
    postfix_expression_str = ''.join(postfix_expression)
    return postfix_expression_str


def main():
    while True:
        try:
            # 输入中缀表达式
            infix_expression = input('请输入中缀表达式: ')
            # 将中缀表达式转化为后缀表达式
            postfix_expression = infix_to_postfix(infix_expression)
            print('后缀表达式为: ', postfix_expression)
            # 计算后缀表达式
            calcution_result = postfix_calcution(postfix_expression)
            print('计算结果为: ', calcution_result)
        except:
            break


if __name__ == '__main__':
    main()
最新回复(0)
/jishuTIxzNmeII_2FGVpoHx7Rdn_2BVxVJ5u187VIHAcJ99cLp6g_3D2700230
8 简首页