【发布时间】:2017-02-27 16:14:52
【问题描述】:
我正在创建一个程序,它将布尔表达式作为字符串接收,并将中缀公式转换为后缀,同时确保公式的格式有效。我很难做的是找出一种方法来检查输入的公式是否有效。 NO IMPORTING 是允许的(使用内置的 python 函数/方法),允许循环和递归。如果公式无效,则返回None。
公式可以包含:
variables in 'abcdefghijklmnopqrstuvwxyz'
operators in '-+*'
其中 - 不是,+ 是 OR,* 是 AND
这里有一些有效的公式(作为 Python 字符串)。
"x"
"-y"
"(x*y)"
"((-x+y)*(-y+x))"
这里有一些不是公式的字符串。
"X" variable not lower case letter
"x*y" missing parentheses
"-(x)" extraneous parentheses
"(x+(y)*z)" mismatched parentheses
一些转换示例是:
(x+y) -> xy+
(x*y) -> xy*
-(x+y) -> xy+-
-x -> x-
((x*y)+(z*x)) -> xy*zx*+
不需要完整的工作程序,检查公式是否有效的算法就可以了。
我目前将公式从中缀转换为后缀的实现:
def infix_to_postfix(infix_expression):
precedence = {}
precedence["*"] = 2
precedence["+"] = 2
precedence["-"] = 2
precedence["("] = 1
storage_stack = Stack()
postfix_list = []
tokenList = list(infix_expression)
for token in tokenList:
if(token not in "-+*()"):
postfix_list.append(token)
elif(token == '-'):
storage_stack.push(token)
elif(token == '('):
storage_stack.push(token)
elif(token == ')'):
topToken = storage_stack.pop()
while(topToken != '('):
postfix_list.append(topToken)
topToken = storage_stack.pop()
else:
while(not storage_stack.is_empty() and precedence[storage_stack.peek()] >= precedence[token]):
postfix_list.append(storage_stack.pop())
storage_stack.push(token)
while(not storage_stack.is_empty()):
postfix_list.append(storage_stack.pop())
result = "".join(postfix_list)
return result
我需要找到一种方法来检查公式是否有效同时更改运算符和变量的位置。
编辑:
我想出了部分算法来检查公式是否有效:
((a+b)*(c+d))
F1 = (a+b)
F2 = (c+d)
((a+b)*(c+d)) = (F1 * F2)
If F1 and F2 are valid, then the whole thing is valid.
用括号括起来的公式在以下情况下有效: 有 ( 和 ),两个子公式之间有一个 + 或 *,两个子公式都有效。
我有这个检查的想法,但我不知道如何实现它。很可能是递归。
【问题讨论】:
-
(x+y)有效,-x有效,但(-x)无效?这不奇怪吗? -
欢迎来到 StackOverflow。请阅读并遵循帮助文档中的发布指南。 on topic 和 how to ask 在这里申请。 StackOverflow 不是设计、编码或教程服务。
-
据我所知,您已经发布了部分问题描述,并要求我们为您做功课。
-
@Elmex80s 我知道这很奇怪,但这就是它必须的样子。括号的条件是必要的,比如(x+-(y*z)),不过度的,比如(((-(x))))。
-
@Prune 我可能会在我的作业上寻求一些帮助,但我并不是在要求一个完整的家庭作业解决方案(为我做这一切)。我所要求的只是想出一个可以检查公式是否有效的算法。
标签: python recursion boolean logic phrase