Python队列前端删除元素异常问题求助(无第三方库)
队列Dequeue功能异常的问题修复
问题原因
你的Dequeue函数存在两个逻辑错误:
- 错误递增front索引:执行
queue.pop(front)后,列表中剩余元素会自动向前移位填补空缺,此时新的队首元素已经处于原front的位置(索引0),但代码中仍执行front = front +1,导致下次删除时跳过真正的队首元素。 - 未更新rear索引:删除元素后,队列长度减少,原rear指向的尾元素索引会前移,但代码中未对rear做递减处理,导致后续队列状态计算(如元素个数)出现偏差。
以你给出的例子为例:
- 初始队列:
[15,25,78,93,41,589],front=0,rear=5 - 第一次Dequeue:
pop(0)删除15,队列变为[25,78,93,41,589],但代码将front设为1,rear仍为5 - 第二次Dequeue:此时
front=1,执行pop(1)会删除索引1的元素78,而非队首的25,这就是异常的根源。
解决方案
修正Dequeue函数的逻辑:
- 删除元素后,不要递增front,因为列表元素已前移,新的队首仍在索引0的位置
- 删除元素且队列未空时,将rear递减1,匹配队列长度变化
修正后的Dequeue函数
def dequeue(): global front, rear, queue if (is_queue_empty()): print("\nQueue is empty.") else: item = queue[front] queue.pop(front) if (front == rear): front = -1 rear = -1 else: # 移除错误的front递增操作,改为递减rear rear = rear - 1 print("\nDeleted element is ", item)
修正后的流程验证
还是用你的初始队列例子:
- 初始状态:队列
[15,25,78,93,41,589],front=0,rear=5 - 第一次Dequeue:
pop(0)删除15,队列变为[25,78,93,41,589],rear递减为4,front保持0 - 第二次Dequeue:
pop(0)删除25,队列变为[78,93,41,589],rear递减为3,front仍为0 - 后续删除操作都会正确移除队首元素,符合队列FIFO的特性
完整修正代码
def is_queue_empty(): if (front == -1): return 1 else: return 0 def is_queue_full(): if (rear == maxsize - 1): return 1 else: return 0 def enqueue(): global front, rear, queue, item if (is_queue_full()): print("\nQueue is full.") else: item = int( input("\nEnter the item at position " + str(rear + 1) + ": ")) if (front == -1): front = 0 rear = 0 else: rear = rear + 1 queue.append(item) def dequeue(): global front, rear, queue if (is_queue_empty()): print("\nQueue is empty.") else: item = queue[front] queue.pop(front) if (front == rear): front = -1 rear = -1 else: rear = rear - 1 print("\nDeleted element is ", item) # print the list def display(): print("\nQueue Size = ", maxsize, ", Number Of Elements In The Queue = ", (rear - front) + 1, ", Occupied Space In The Queue = ", rear + 1, ", Available Size In The Queue = ", maxsize - (rear + 1)) if (is_queue_empty()): print("\nQueue is empty.") else: print("\nYour queue: ", queue) def set_queue_size(): global maxsize maxsize = int(input("Enter the size of the queue: ")) queue = [] # Initializing an empty queue front = rear = -1 # Driver Code set_queue_size() print("\n1. EnQueue") print("\n2. DeQueue") print("\n3. Display") print("\n4. Update the size of the queue") print("\n5. Exit") while (1): ch = int(input("\nEnter your choice: ")) if (ch == 1): enqueue() continue elif (ch == 2): dequeue() continue elif (ch == 3): display() continue elif (ch == 4): set_queue_size() continue elif (ch == 5): break else: print("\nWrong choice. Try again") continue
内容的提问来源于stack exchange,提问作者user20424685
相关产品推荐
相关产品推荐

