Python 前缀/中缀/后缀表达式求值
Python Prefix / Infix / Postfix expression evaluation
关于代码的小简介:
我必须做一个 class 来计算前缀、后缀或中缀表达式。它必须判断它是否是pre/post/infix并将它们转换为后缀,例如代码中的prefixTOpostfix()
(其他现在不需要删除)方法将'/x7'转换为'x7/',表达式在方法 edit()
中从 'x7/' 编辑为 'x 7 /'。这两种方法都工作正常,在多个示例上进行了测试(没有在这里发布整个代码和分配,但也不需要它们。被问到的问题只是我遇到的一个错误,别担心我不是在要求解决我的任务)。还有assign
方法,因为可以有变量,比如'a = 3',可以在表达式的某处。
问题:当我运行print(v.evaluate('x 7/'))
(已经在postfix中的),wherex = 14
,它returns2
正如它应该。但是,当我 运行 print(v.evaluate('/x 7'))
(前缀中的内容)时,它 returns None
。 两个表达式在运行通过它们的方法'x 7 /'后看起来完全一样(我在代码中测试了prints
),两个 堆栈是相同的。首先是 '14'
,然后是 '14 7'
,最后是 '2'
。当我将 return(s.pop())
更改为 return(s.top())
时,两个表达式都被评估为 '2'
。那么为什么 return(s.pop())
不能 使用第二个呢?如果对代码有更多的疑问或不够清楚的地方,告诉我,我会尝试以不同的方式解释它。
class MyClass:
class Stack:
...
def __init__(self):
self.table = {}
def __repr__(self):
...
def assign(self, variable, exp):
if '+-*/%' in exp: # temporary solution
exp = self.evaluate(exp)
self.table[variable] = exp
def evaluate(self, exp):
if exp[0] in '+-*/%': # Prefix
new_exp = self.prefixTOpostfix(exp)
self.evaluate(new_exp)
elif exp[len(exp)-1] in '+-*/%': # Postfix
s = self.Stack()
exp = self.edit(exp) # from 'x7/' to 'x 7 /'
for item in exp.split():
if item == '+':
s.push(s.pop() + s.pop())
... # other operations
elif prvok == '/':
temp = s.pop()
if temp == 0:
return None
s.push(s.pop() // temp) # it has to be // !
else: # if it is number / variable
if item in self.table:
s.push(int(self.table[item]))
else:
s.push(int(item))
s.printOUT()
return(s.pop())
else: # Infix
...
def prefixTOpostfix(self, exp):
...
def edit(self, exp):
...
if exp[0] in '+-*/%': # Prefix
new_exp = self.prefixTOpostfix(exp)
self.evaluate(new_exp)
您需要return
递归调用的结果。
if exp[0] in '+-*/%': # Prefix
new_exp = self.prefixTOpostfix(exp)
return self.evaluate(new_exp)
关于代码的小简介:
我必须做一个 class 来计算前缀、后缀或中缀表达式。它必须判断它是否是pre/post/infix并将它们转换为后缀,例如代码中的prefixTOpostfix()
(其他现在不需要删除)方法将'/x7'转换为'x7/',表达式在方法 edit()
中从 'x7/' 编辑为 'x 7 /'。这两种方法都工作正常,在多个示例上进行了测试(没有在这里发布整个代码和分配,但也不需要它们。被问到的问题只是我遇到的一个错误,别担心我不是在要求解决我的任务)。还有assign
方法,因为可以有变量,比如'a = 3',可以在表达式的某处。
问题:当我运行print(v.evaluate('x 7/'))
(已经在postfix中的),wherex = 14
,它returns2
正如它应该。但是,当我 运行 print(v.evaluate('/x 7'))
(前缀中的内容)时,它 returns None
。 两个表达式在运行通过它们的方法'x 7 /'后看起来完全一样(我在代码中测试了prints
),两个 堆栈是相同的。首先是 '14'
,然后是 '14 7'
,最后是 '2'
。当我将 return(s.pop())
更改为 return(s.top())
时,两个表达式都被评估为 '2'
。那么为什么 return(s.pop())
不能 使用第二个呢?如果对代码有更多的疑问或不够清楚的地方,告诉我,我会尝试以不同的方式解释它。
class MyClass:
class Stack:
...
def __init__(self):
self.table = {}
def __repr__(self):
...
def assign(self, variable, exp):
if '+-*/%' in exp: # temporary solution
exp = self.evaluate(exp)
self.table[variable] = exp
def evaluate(self, exp):
if exp[0] in '+-*/%': # Prefix
new_exp = self.prefixTOpostfix(exp)
self.evaluate(new_exp)
elif exp[len(exp)-1] in '+-*/%': # Postfix
s = self.Stack()
exp = self.edit(exp) # from 'x7/' to 'x 7 /'
for item in exp.split():
if item == '+':
s.push(s.pop() + s.pop())
... # other operations
elif prvok == '/':
temp = s.pop()
if temp == 0:
return None
s.push(s.pop() // temp) # it has to be // !
else: # if it is number / variable
if item in self.table:
s.push(int(self.table[item]))
else:
s.push(int(item))
s.printOUT()
return(s.pop())
else: # Infix
...
def prefixTOpostfix(self, exp):
...
def edit(self, exp):
...
if exp[0] in '+-*/%': # Prefix
new_exp = self.prefixTOpostfix(exp)
self.evaluate(new_exp)
您需要return
递归调用的结果。
if exp[0] in '+-*/%': # Prefix
new_exp = self.prefixTOpostfix(exp)
return self.evaluate(new_exp)