从堆栈中删除项目,而不使用pop,peek,push

时间:2018-01-26 01:48:30

标签: python python-3.x stack adt

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

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

在stack_array模块中编写并测试方法组合。从名为q3.py的模块中测试它。

这是扩展Stack类。它应该产生与问题1相同的结果,但它必须在Stack代码定义的最低级别工作。换句话说,这个方法不能调用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

1 个答案:

答案 0 :(得分: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方法可以做到这一点,比如使用迭代器和内置函数,但是这个最小的逻辑应该可以让你完成任务。

由于这是作业,我会把剩下的留给你。