首页 > 解决方案 > 有没有办法在删除项目后输出队列的内容?

问题描述

我正在为队列(特别是线性队列)编写代码,并且正在尝试从队列中删除一个项目。删除一个项目后输出队列时,队列中的内容没有改变,所有项目都还在。有没有办法解决这个问题?

我尝试在删除每个项目后打印出队列,但输出仍然没有改变。

import sys
class Queue:
    def __init__(self):
        self.head = 0
        self.tail = 0
        self.MaxSize = 4 
        self.queue = []

    def size(self):
        return self.tail - self.head

    def enqueue(self,data):
        if self.size() > self.MaxSize:
            return("Queue Full")

        else:
            self.queue.append(data)
            self.tail += 1
            return True

    def dequeue(self):
        if self.size() <= 0:
            self.reset()
            return("Queue Empty")
        data = self.queue[self.head]
        self.head += 1
        return data

    def reset(self):
        self.head = 0
        self.tail = 0
        self.queue = []

q = Queue()
def addOrRemove():
    print("Current Queue Size - ", q.size())
    print()
    addRemove = input("Add(A), Remove(R), End(E), View(V) ")
    addRemove = addRemove.upper()
    while True:
        if addRemove == 'A':
            add = input("Enter input - ")
            q.enqueue(add)
            if q.size() > q.MaxSize:
                print("Queue Full")
            addOrRemove()
        elif addRemove == 'R':
            q.dequeue()
            print(q.queue)
            if q.size() <= 0:
                print("Queue Empty")
                q.reset()
            addOrRemove()
        elif addRemove == 'E':
            sys.exit()
        elif addRemove == 'V':
            print(" ".join(q.queue))
            addOrRemove()
        else:
            print("Invalid input")
            addOrRemove()
            return False
addOrRemove()

将“牛奶”、“糖”和“鸡蛋”添加到队列中。删除一个项目应该删除“牛奶”,打印队列应该输出“糖”和“鸡蛋”,但实际输出仍然是“牛奶”、“糖”和“鸡蛋”。

标签: pythonqueue

解决方案


这里的问题不是你的打印,而是你的队列。看你的dequeue()方法:

def dequeue(self):
    if self.size() <= 0:
        self.reset()
        return("Queue Empty")
    data = self.queue[self.head]
    self.head += 1
    return data

您绝不会从 中删除任何内容self.queue,因此当您尝试打印它时,它自然不会改变。

这里的解决方案是

data = self.queue[self.head]

这本身就是一个逻辑错误(如果self.queueand中只有 3 个元素self.head == 5怎么办?你会得到一个错误),做

data = self.queue.pop(0)

它从中删除第一个元素self.queue并将其返回。由于enqueue()您将添加到列表的末尾并且dequeue()您将从列表的开头删除,因此它是一个有效的队列。


推荐阅读