【问题标题】:Removing an item from a stack, without using pop, peek, push从堆栈中删除一个项目,而不使用 pop、peek、push
【发布时间】:2018-07-05 09:38:41
【问题描述】:

我不明白他们在问什么。有人可以澄清这个问题吗?

问题是:(他们给了我们文档字符串)

在 stack_array 模块中编写并测试方法 combine。通过名为 q3.py 的模块对其进行测试。

这是对 Stack 类的扩展。它应该产生与问题 1 相同的结果,但它必须在堆栈代码定义的最低级别工作。也就是说,这个方法不能调用Stack的push和pop,它必须直接使用_values。

def combine(self, s2):
    """
    -------------------------------------------------------
    Combines a second stack with the current stack.
    (iterative algorithm)
    Use: s3 = s1.combine(s2)
    -------------------------------------------------------
    Preconditions:
       s2 - an array-based stack (Stack)
    Postconditions:
       Returns:
          s3 - the contents of the current stack and s2
          are interlaced into s3 - current stack and s2
          are empty (Stack)
   -------------------------------------------------------
   """
   #Write your code here

我已经使用 push、pop 和 peek 解决了这个问题。

s3 = Stack()
if len(s1._values) >= len(s2._values):
    for things in s1:
        if s2.is_empty() != True:
            s3.push(things)
            s1.pop()
            s3.push(s2.peek())
            s2.pop()
        else:
            s3.push(things)
            s1.pop()
else:
    for things in s2:
        if s1.is_empty() != True:
            s3.push(things)
            s2.pop()
            s3.push(s1.peek())
            s1.pop()
        else:
            s3.push(things)
            s2.pop()
return s3

【问题讨论】:

  • 我们不会做你的功课或老师的工作来给出正确的指示。
  • 我不是要求人们做我的功课,我只是想澄清一下问题是什么,或者人们将如何尝试。
  • 如果你不理解你的作业,请让你的老师澄清一下。他们最清楚被问到的是什么,而且他们会得到报酬来教你。
  • 它如何创建新堆栈?所以如果你有s1 作为[1,2,3]s2 作为[3,4,5]s3 必须是什么样子?会是[1, 3, 2, 4, 3, 5]吗?
  • @RoadRunner :它使用它创建一个新堆栈,是的,它应该看起来像那样。 'def __init__(self): """ ---------------------------------------- --------------- 初始化一个空栈。数据存储在一个列表中。使用:s = Stack() ---------------- --------------------------------------- 后置条件:初始化一个空栈。---- -------------------------------------------------- - """ self._values = [] return'

标签: python python-3.x stack adt


【解决方案1】:

由于您不能使用堆栈方法,因此您需要回归基础。

为了交错s1s2,您首先需要有一个循环,不断从两个堆栈中添加相应的元素,直到其中一个为空。您可以在此处使用内置函数,例如 zip()itertools.zip_longest ,但现在我们将保持简单。

假设你有两个堆栈列表,s3 声明为:

s3 = Stack()

first = self.items
second = s2.items

您可以使用计数器将相应的元素添加在一起:

i = 0
while i < len(first) and i < len(second):
    s3.items.append(first[i])
    s3.items.append(second[i])
    i += 1

基本上迭代直到i 超过firstsecond 的长度。所以如果你有s1 作为[1,2,3]s2 作为[4, 5],这将创建[1, 4, 2, 5]

但是,如上所示,如果列表长度不同,则需要将较大列表的其余部分扩展到s3。为此,您需要检查i 是否小于firstsecond 的原始长度。

你可以这样做:

if i < len(second):
    s3.items.extend(second[i:])

elif i < len(first):
    s3.items.extend(first[i:])

如果这些条件都没有被触发,那么两个列表的大小一开始就相同。

还有更多的 Pythonic 方法可以做到这一点,例如使用迭代器和内置函数,但这个最基本的逻辑应该可以让您完成任务。

因为这是作业,剩下的交给你。

【讨论】:

  • 非常感谢! @RoadRunner
  • @JadFoukAladeh 没问题。如果这对您有帮助,请务必将其标记为正确。
猜你喜欢
  • 2016-08-16
  • 2021-11-19
  • 2013-04-20
  • 2017-01-26
  • 2013-12-21
  • 1970-01-01
  • 2010-09-30
  • 2018-05-24
  • 1970-01-01
相关资源
最近更新 更多