【问题标题】:A function accepting two stacks as parameters and return a Python list接受两个堆栈作为参数并返回 Python 列表的函数
【发布时间】:2015-03-24 17:19:05
【问题描述】:

请帮我写一个函数,将两个堆栈中的数字按位置相加,并将结果作为列表返回。

这里的代码是栈上的操作:

stack_a = Stack()
stack_a.push(1)
stack_a.push(2)
stack_b = Stack()
stack_b.push(6)
stack_b.push(8)
result = add(stack_a , stack_b)
print(result)

这里是 Stack 类的定义

class Stack:
  def __init__(self):
    self.items = []

  def is_empty(self):
    return self.items == []

  def push(self, item):
    self.items.append(item)

  def pop(self):
    return self.items.pop()

  def peek(self):
    return self.items[len(self.items) - 1]

  def size(self):
    return len(self.items)

这是我到目前为止所做的:

def add(first, second):
  return first.pop() + second.pop()

我得到了 10 个,它只考虑了 stack_a.push(2) 和 stack_a.push(10) 的添加。请帮助我改进我目前所取得的成果。

【问题讨论】:

  • 你需要某种循环
  • 列表中应该包含什么?如果两个堆栈的大小不同怎么办?在执行此操作的过程中是否可以销毁(可能会删除所有)两个堆栈中的项目?

标签: python stack


【解决方案1】:

除了我添加的额外add_all 函数之外,您的代码将是相同的。它弹出您提供的两个堆栈中的最后一项,添加它们,并将它们附加到您获得的列表中。

请注意,返回列表中的顺序是从后到前的,就像在您的 add 函数中一样。

def add(first, second):
    return first.pop() + second.pop()

def add_all(first_stack, second_stack):
    """
    Pops last elements of two stacks and adds them,
    until all elements are added.

    Returns:
        list
    """

    returned_lst = []

    # Determine the how many items will be added.
    # (ensures that no errors are raised if two stacks have different size)
    number_of_items_to_be_added = min(first_stack.size()), second_stack.size())

    # If you are using Python 2.x use 'xrange' instead of 'range'
    for element in range(number_of_items_to_be_added):
        returned_lst.append(add(first_stack, second_stack))

    return returned_lst

stack_a = Stack()
stack_a.push(1)
stack_a.push(2)
stack_b = Stack()
stack_b.push(6)
stack_b.push(8)
stack_b.push(9)

result = add_all(stack_a, stack_b)
print(result)

如果我误解了您的需求,或者您还需要什么,请告诉我。

【讨论】:

  • 从技术上讲,您通过使用 min(len(first_stack.items), len(second_stack.items)) 而不是 min(first_stack.size(), second_stack.size()) 来破坏对象封装。如果Stack 的实现发生变化,因为它引入了对其(隐藏)实现的不必要的依赖,那么直接访问这样的类内部结构会使代码更容易中断,也就是“脆弱”。
  • @martineau size() 是什么?
  • 这是Stack 对象所具有的返回len(self.items) 的方法的名称。它位于 OP 问题中 class Stack 定义的末尾。
【解决方案2】:

您将需要遍历堆栈的元素,我们看到堆栈的元素存储在 .items 中,这是一个列表,因此我们找出列表的长度并遍历每个索引并添加相应的元素。

如果两个堆栈的长度不相等,那么它将迭代到两者中最小值的长度。

def add(first, second):
    answer = []
    for i in xrange(min(len(first.items), len(second.items))):
        answer.append(first.items[i]+second.items[i])
    return answer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-24
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    相关资源
    最近更新 更多