当前位置: 首页 > 知识库问答 >
问题:

检查布尔数学公式的形式是否正确

宗政功
2023-03-14

我正在创建一个程序,它将布尔表达式作为字符串输入,并将中缀公式转换为后缀公式,同时确保公式的形式有效。我很难找到一种方法来检查输入的公式是否有效。不允许导入(使用内置的python函数/方法),允许循环和递归。如果公式无效,请返回None。

公式可以包含:

variables in 'abcdefghijklmnopqrstuvwxyz'
operators in '-+*'
"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.

共有1个答案

帅煌
2023-03-14

这是一个老问题,但这里有一个潜在的解决方案,有人有相同的问题。

import re


def formula(string):
    if not string: return 0
    string = re.sub("[^0-9+*/%-=]", "", string)

try:
    string, result = string.split("=")
    return eval(string) == int(result)
except:
    return 0
 类似资料:
  • 例如,如果我的程序是这样正确启动的: 但是,我想阻止用户输入此表单以外的内容。 因此,只要命令行参数的格式不是我希望我的程序退出并打印错误代码。 我不知道怎么做。对于这种情况,如果有人输入什么,我只是用ArrayIndexOutofBound尝试捕捉,但我不知道如何特别捕捉每一个可能的命令行参数,这是不正确的形式。

  • 问题内容: 如何检查布尔值是否为null?因此,如果我知道“ hideInNav”为空。如何阻止它进一步执行?像下面这样的东西似乎不起作用,但是为什么呢? 问题答案: 只能是或因为它是原始数据类型(+ 变量的默认值为)。如果要使用值,则可以改用类。布尔是一种引用类型,这就是您可以分配给布尔“变量”的原因。例:

  • 数学环境 \placeformula[1]%给数学公式编号[引用标记] \startformula %数学环境起始声明 y=x^2 \stopformula %数学环境结束声明 这是行内的数学环境 $\int_0^1 x^2 dx$ 运算符 可以直接使用的基本运算符有: + - = < > 数学符号 命令 ± \pm × \times ÷ \div * \ast ★ \st

  • 在java以下作品:

  • 问题内容: 因此,我听说如果将2个字符串与==进行比较,则只有它们都引用相同的对象/实例时,我才会返回true。那是琴弦。布尔呢? 问题答案: ==是否检查布尔值是否完全相等?-Java 这取决于您是在谈论s(对象包装,请注意大写)还是s(原始,请注意小写)。如果您在谈论s(对象包装器),就像处理所有对象一样,请检查 身份 ,而不是对 等 。如果您在谈论s(基元),它将检查是否相等。 所以: 但

  • 我正在尝试编写布尔方法,但它不起作用 它的工作,如果我写这个方法: 我应该如何为它制作布尔方法?