我不明白他们在问什么。有人可以澄清这个问题吗?
问题是:(他们给了我们文件字符串)
在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
答案 0 :(得分:1)
由于您无法使用堆栈方法,因此需要回到基础知识。
为了交织s1
和s2
,您需要首先有一个循环,不断从两个堆栈添加相应的元素,直到其中一个为空。您可以在此处使用内置函数,例如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
超过first
或second
的长度。因此,如果s1
为[1,2,3]
而s2
为[4, 5]
,则会创建[1, 4, 2, 5]
。
但是,如上所示,如果列表的长度不同,则需要将较大列表的其余部分扩展为s3
。为此,您需要检查i
是否小于first
和second
的原始长度。
以下是您可以这样做的方法:
if i < len(second):
s3.items.extend(second[i:])
elif i < len(first):
s3.items.extend(first[i:])
如果没有触发这些条件,则两个列表的大小都相同。
有更多的pythonic方法可以做到这一点,比如使用迭代器和内置函数,但是这个最小的逻辑应该可以让你完成任务。
由于这是作业,我会把剩下的留给你。