尝试将堆栈中的所有数字相乘,我最初想到将所有元素弹出到列表然后相乘但不确定如何/如果这是正确的。
这是我目前的代码,但我得到了:
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
答案 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
。