文档管理系统队列与栈交互异常:入队数据异常存入栈求助
文档管理系统队列Bug修复
问题现象
- 入队3个文档后执行3次出队操作,数据正常存入栈,第4次出队提示队列为空,逻辑正常;
- 队列空后再次入队时,新文档未进入队列,反而会删除栈顶下方的所有元素并添加到栈顶下方,后续每次入队的数据都持续存入栈,队列始终为空。
Bug原因分析
问题出在dequeue函数中:当队列的最后一个元素被出队时,仅将q->front设为NULL,但未同步更新q->rear为NULL。此时q->rear仍指向已被出队并移入栈中的节点,后续调用enqueue时,判断条件q->front == NULL && q->rear == NULL不成立,代码会执行q->rear->next = temp,将新节点挂载到栈顶节点的next指针上,同时更新q->rear为新节点,导致新元素直接进入栈结构,队列的front始终为NULL,表现为队列一直为空。
修复方案
修改dequeue函数,当出队后队列为空时,同步将q->rear设为NULL:
doc* dequeue(queue *q) { if(q->front == NULL) { printf("Queue is empty!\n"); system("pause"); return NULL; } doc *temp; temp = q->front; q->front = temp->next; // 新增:队列空时同步重置rear指针 if(q->front == NULL) { q->rear = NULL; } temp->next = NULL; return temp; }
修复后验证
队列清空后再次入队,新元素会正常加入队列,栈的原有数据不会被篡改,队列与栈的逻辑恢复正常。
内容的提问来源于stack exchange,提问作者Md. Nawshin Zaman
相关产品推荐
相关产品推荐

