【问题标题】:Python prefix to infix notation using a stack data structure使用堆栈数据结构中缀符号的 Python 前缀
【发布时间】:2018-10-02 01:39:39
【问题描述】:

我有一个关于使用堆栈数据结构解决问题的分配问题。系统提示我创建以下堆栈函数。

任务:使用您创建的堆栈,编写函数prefix_infix,它接受一个前缀表达式(表示为一个列表)并以全括号中缀表示法返回表达式。考虑只涉及二元运算符的表达式(+,-,*,/) 您可以在此处找到有关前缀的信息: http://en.wikipedia.org/wiki/Polish_notation

def make_stack(): 
    stack=[]
    def helper(*args): 
        if args[0]=='push': 
            stack.append(args[1])
        elif args[0]=='peek': 
            return (stack[-1]) 
        elif args[0]=="pop": 
            return (stack.pop())
        elif args[0]=="size": 
            return (len(stack))
    return helper 



def prefix_infix(lst): 
    stk=make_stack() 
    def helper(lst):
        if type(lst)==int: 
            stk('push',str(lst))
        elif lst in ('+','-','*','/'): 
            left=stk('pop')
            right=stk('pop')
            element="("+left+" "+lst+" "+right+")"
            stk('push',element)
        else:
            return helper(lst[2]),helper(lst[1]),helper(lst[0]) 
    helper(lst)
    return stk('pop')

prefix_infix(['+',['*',5,4],['-',2,1]])
#Output: "((5 * 4) + (2 - 1))"

prefix_infix(['-',['*',5,4],['-',['/',1,45],['+',1,1]]])
#Output:((5 * 4) - ((1 / 45) - (1 + 1)))

我不知何故让我的代码产生了正确的输出,但我对我的方法不是很有信心,因为我用递归做到了,但我不知道用递归做它的正确方法是什么(我的递归调用, 似乎很随意)。有人可以建议我可以编写一些其他版本的代码以使其更容易理解吗?我无法真正可视化堆栈,大多数时候我只是对递归函数感到幸运。

【问题讨论】:

  • 您是在寻找代码优化还是其他方法?
  • 也许是另一种方法,我对操作堆栈不太满意,我有点画出我需要做的事情然后编写代码,但似乎不太令人信服。

标签: python stack


【解决方案1】:

如果您使用递归,则不必手动管理堆栈(递归为您管理堆栈)。例如:

def prefix_infix(expression):
    if isinstance(expression, list):
        op, left, right = expression
        return '(' + prefix_infix(left) + op + prefix_infix(right) + ')'
    else:
        return str(expression)

print(prefix_infix(['+',['*',5,4],['-',2,1]]))
print(prefix_infix(['-',['*',5,4],['-',['/',1,45],['+',1,1]]]))

输出:

((5 * 4) + (2 - 1))
((5 * 4) - ((1 / 45) - (1 + 1)))

编辑(评论后):这是添加表达式数值评估的版本:

def eval_prefix(expression):
  return eval(prefix_infix(expression))

输出:

eval_prefix(['+',['*',5,4],['-',2,1]])) # --> 21
eval_prefix(['-',['*',5,4],['-',['//',9,3],['+',1,1]]])) # --> 19

【讨论】:

  • 是的,我作业的测试用例使用了嵌套列表,我也觉得很奇怪
  • 可以不使用格式化字符吗?还是更好地尝试使用提供的堆栈结构?我并没有真正接受过这些技能的培训,也许我应该在没有它们的情况下做到这一点。
  • @Prashin:好的,我用纯字符串连接替换了格式化字符
  • 我实际上有一个迫切的问题,如果我想以字符串形式评估结果,例如((5 * 4) + (2 - 1)),我该如何更改代码,除了编写条件语句之外,是否还有一种简洁的编写方式匹配每个括号中的运算符?
  • @Prashin:我已经编辑了答案以添加评估解决方案
【解决方案2】:
def is_operand(c):
    return c.isdigit()

def prefix_to_infix(expression):
    stack = []
    for c in expression[::-1]:
        if is_operand(c):
            stack.append(c)
        else:
            o1=stack.pop()
            o2=stack.pop()
            if c== "+":
                element=   o1 + c + o2
                stack.append(element)
            if c=="-":
                element= o1 + c +o2 
                stack.append(element)
            if c== "*":
                element=  o1 + c +o2 
                stack.append(element)
    return stack
def evaluate(stack):
    expression=str(stack[0])
    return eval(expression) 
        

【讨论】:

    猜你喜欢
    • 2021-10-02
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    • 2013-11-08
    • 2013-02-26
    • 2021-12-06
    • 2016-06-19
    • 1970-01-01
    相关资源
    最近更新 更多