题意大概为:
实现逻辑运算计算器功能,逻辑运算符: !(非)、|(或)、(与),其优先级为 !|。
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()