堆叠,弹出和添加

时间:2014-03-21 11:47:17

标签: python

calculate函数应该像这样工作

calculate((1, 2, '+', 3, '*')) which return 9
1. take 1, push 1   # stack is [1]
2. take 2, push 2   #stack is [1, 2]
3. take '+', pop 2, pop 1, calculate 1+2 = 3, push 3 #stack is [3]
4. take 3, push 3 #stack is [3, 3]
5. take '*', pop 3, pop 3, calculate 3 * 3 = 9, push 9 #stack is [9]
6. input empty, pop 9, return 9

我不知道如何使用字符串' +'这里将1和2加在一起。似乎不可能。

这是我的代码。我们假设转换元组并将其放入一个列表然后弹出前两个数字然后与任何二元运算符'+', '-', '*', '/'结合使用

def calculate(inputs):  #(1, 2, '+', 3, '/')
    if len(inputs) <= 1:
        return inputs[0]
    for i in range(len(inputs)+1):  ## (0,...5)
        s = make_empty_stack() # [] 
        first = push_stack(s, inputs[i])  #[1]
# push_stack pushes an item onto the stack s, returns the stack
        second = push_stack(s, inputs[i + 1]) ##[2,1]
        third = push_stack(s, inputs[i +2]) ##[2,1,+]
        f = pop_stack(third)  #Removes the top item of the stack #2

以下是一些测试用例

calculate((1, 2, '+', 3, '*')) ## 1+2 then * 3
calculate((1, 2, '+', 3, '/'))  ## (1 +2) / 3 = 1
calculate((28,)) # 28
calculate((1, 2, '*', 3, '-', 2, '*', 5, '+'))  ## ((1*2) - 3) * 2)+5 = 3

1 个答案:

答案 0 :(得分:1)

operator module为大多数Python运算符提供了方便的功能,包括+*

import operator

ops = {'+': operator.add, '-': operator.sub,
       '*': operator.mul, '/': operator.floordiv}

现在您可以使用ops字典在堆栈上实现操作:

def calculate(inputs):
    if not inputs:
        return
    s = make_empty_stack()
    for item in inputs:
        if item in ops:
            op2, op1 = pop_stack(s), pop_stack(s)
            res = ops[item](op1, op2)
            push_stack(s, res)
        else:
            push_stack(s, item)
    return pop_stack(s)

代码弹出堆栈中的两个项目并将它们传递给操作员函数,前提是item是一个有效的操作符。但是,您需要反转操作数;你想从堆栈中的第二个项目中减去最顶层的堆栈项目,而不是相反。其他所有东西都被推到了堆栈中。

请注意,您需要在循环外部一次创建一个空堆栈。