【问题标题】:Taking a queue of integers and making copies of that element获取整数队列并复制该元素
【发布时间】:2015-03-30 17:03:42
【问题描述】:

“编写一个名为 stutter 的函数,它接受一个整数队列作为参数,并将队列中的每个元素替换为原始队列中该元素的两个副本。”

例子:

q1 = Queue()
queue.enqueue(1)
queue.enqueue(2)
queue.enqueue(3)
stutter(q1)
while not queue.isempty():
    print(queue.dequeue(), end=' ')

应该给出“1 1 2 2 3 3”的答案

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

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

        def enqueue(self, item):
            self.items.insert(0,item)

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

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

        def check_empty(self):
            if self.items == []:
                return True

def stutter(Q):
    queue=Queue()
    stack = Stack()
    while not queue.isempty():
        stack.push(queue.dequeue())

    while not stack.isempty():
        queue.enqueue(stack.pop())

那是我写的代码,我可以让它打印一次,一次,我不能让它复制并按顺序排序。

【问题讨论】:

  • 您正在将参数传递给 stutter 函数(其中包含 1 2 3),但随后不使用它。该参数在调用代码中称为 q1,在 stutter 函数中称为 Q。因为你没有在 stutter 函数中对 Q 做任何事情(你创建了一个新的队列,它将是空的),所以在你返回函数之后打印 q1 不出所料地在函数被调用之前返回 q1 的值。这是对函数工作原理的一个非常根本的误解,您可能需要在提出问题之前进行更多研究(例如阅读教科书,如果有的话)。

标签: python stack queue


【解决方案1】:

尝试使用这个(暂时无法测试):

def stutter(queue):
    # iterate all items
    for _ in range(queue.size()):
        # store item in local context
        item = queue.dequeue()
        # push two *references* to item into the queue
        queue.enqueue(item)
        queue.enqueue(item)

这将迭代所有项目一次,立即将两个应对推到队列的后面。迭代结束后,第一个推送的项目应该是第一个。

注意对象不会被复制,队列中会有两个对同一个对象的引用。

提示: Python 中已经有一个队列实现。可以通过导入queue来使用

【讨论】:

  • "TypeError: 'int' object is not iterable".
  • @user3886897 抱歉,忘记将stack 替换为queue 并使用range。立即尝试。
【解决方案2】:
In [17]:

def stutter(q):
    for i in range(q.size()):
        elm = q.dequeue()
        q.enqueue(elm)
        q.enqueue(elm)



In [18]:

q1 = Queue()
q1.enqueue(1)
q1.enqueue(2)
q1.enqueue(3)
stutter(q1)
print q1
[3, 3, 2, 2, 1, 1]

注意,我在 Queue 类中添加了一个 str 方法来查看结果。

class Queue:
        # SAME AS BEFORE
        def __str__(self):
            return str(self.items)

你也可以作弊,因为 python 没有私有实例变量。我不会推荐它作为一个选项。

def stutter(q):
    q.items = sorted([elm for elm in q.items] + [elm for elm in q.items])

如果您想使用所需的输出返回:

q1 = Queue()
q1.enqueue(1)
q1.enqueue(2)
q1.enqueue(3)
stutter(q1)
print(' '.join([str(elm) for elm in q1.items]))
1 1 2 2 3 3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    • 2018-09-20
    • 2012-04-09
    • 2021-07-16
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    相关资源
    最近更新 更多