如何将堆栈中的所有数字相乘

时间:2016-04-05 22:40:18

标签: python-3.x stack

尝试将堆栈中的所有数字相乘,我最初想到将所有元素弹出到列表然后相乘但不确定如何/如果这是正确的。

这是我目前的代码,但我得到了:

  

TypeError:'方法' object不能解释为整数。

<properties>
    <!-- Optional URL to server. Default value is http://localhost:9000 -->
    <sonar.host.url>http://myserver:9000</sonar.host.url>
</properties>

我做了一个测试用例

def multi_stack(s):
  stack = Stack()
  mult = 1
  size = my_stack.size
  for number in range(size):
    tmp = my_stack.pop(size)
    mult = mult * tmp
    L.append(tmp)
  for number in range(size):
    my_stack.push(L.pop())
    print(must)

这应打印出来:

  my_stack = Stack()
  my_stack.push(12)
  my_stack.push(2)
  my_stack.push(4)
  my_stack.push(40)
  print(multi_stack(my_stack))
  print(my_stack.size())`

Stack class I使用

3840
0

2 个答案:

答案 0 :(得分:1)

Python列出了支持append()和pop()方法,允许您复制LIFO堆栈行为。使用append()添加到end和pop()以删除最后一个元素。

但是,底层数据结构仍然是一个列表。您可以使用许多内容将列表相乘。例如,假设一个非空列表:

import functools

mylist = [i for i in range(1, 10)]
product = functools.reduce(lambda x, y: x * y, mylist)

mylist = [i for i in range(1, 10)]
product = mylist[0]
for j in mylist[1:]: 
    product *= j

编辑:以下是使用Stack类的示例:

import functools


stack = Stack()
stack.push(1)
stack.push(3)
stack.push(9)

def multi_stack(s):
    """
    s: a Stack() object
    """
    return functools.reduce(lambda x, y: x * y, s.items)

def multi_stack_readable(s):
    """
    s: a Stack() object
    """
    if s.size() > 1:
        product = s.items[0]
        for i in s.items[1:]:
            product *= i

        return product
    elif s.size() == 1:
        return s.items
    else:
        raise IndexError("the stack is empty!")


print(multi_stack(stack))
print(multi_stack_readable(stack))

使用lambda函数有时被认为不太可读,所以我使用for循环包含了一个更易读的版本。两者都产生相同的结果。

答案 1 :(得分:1)

您的代码无效,因为size = my_stack.size会返回方法对象而不是您期望的整数;你忘了在最后添加括号来实际调用方法。因此,当您尝试for number in range(size):时,您会收到异常,因为您将方法对象而不是整数传递给range()。还有一堆其他的错误:你根本没有使用传递给函数的参数,而是影响全局变量my_stack(除非那是你的意图);您正在对某个未知变量L执行操作;您在函数顶部创建了stack并且没有对其执行任何操作,依此类推。总的来说,对于这样一个简单的目标来说太复杂了。有更有效的方法可以执行此操作,但需要更正代码:

def multi_stack(s):
  mult = 1
  size = s.size()
  for i in range(size):
    tmp = s.pop()
    mult = mult * tmp
  return mult

这应该返回您期望的产品,尽管它不会清空堆栈。如果你想,那么去除函数参数,并像以前一样用s代替my_stack