基于数组的队列插入元素后无法显示正确值的原因排查
数组实现队列时插入元素后无法打印的问题分析与修复
核心错误点
元素插入位置越界:
你的insert函数中使用arr[rear++] = n,初始rear值为-1,后置自增会先将值写入arr[-1](数组下标越界,属于未定义行为),之后rear才变为0。这导致元素根本没存入数组的有效位置,后续自然无法打印。正确做法是用前置自增++rear,先把rear从-1变为0,再赋值给arr[0],确保下标合法。构造函数数组初始化越界:
构造函数里的arr[MAX] = {0};是非法操作,数组arr的有效下标是0到MAX-1,arr[MAX]超出了数组边界,可能意外篡改其他成员变量的值(这很可能是你看到front=1、rear=0的原因)。remove函数返回值不规范:
返回NULL不合适,因为NULL是指针类型,而函数返回int,建议返回约定的无效值(比如-1)来表示队列空的情况。
修正后的完整代码
#include <iostream> #define MAX 10 class queue { private: int rear; int front; int arr[MAX]; int data; public: // 用初始化列表正确初始化所有成员,包括数组 queue() : rear(-1), front(-1), arr{0}, data(0) {} void insert(int n) { if (rear == MAX-1) { std::cout << "queue is full" << std::endl; return; } if(front == -1) front = 0; // 前置自增,确保下标有效 arr[++rear] = n; // 增加空格分隔数值,便于查看 std::cout << "front: " << front << ", rear: " << rear << " | 队列元素: "; for (int i = front; i <= rear; i++) { std::cout << arr[i] << " "; } std::cout << '\n'; } int remove() { // 增加front > rear的判断,处理多次删除后队列空的情况 if (front == -1 || front > rear) { std::cout << "queue is empty" << std::endl; return -1; // 用-1作为空队列的返回标记 } data = arr[front]; if (front == rear) front = rear = -1; else front++; return data; } }; int main() { queue q; q.insert(1); q.insert(2); q.remove(); q.insert(3); return 0; }
运行效果说明
执行后控制台输出:
front: 0, rear: 0 | 队列元素: 1 front: 0, rear: 1 | 队列元素: 1 2 front: 1, rear: 2 | 队列元素: 2 3
完全符合队列先进先出的特性,插入的元素能被正常打印。
内容的提问来源于stack exchange,提问作者blazingcannon
相关产品推荐
相关产品推荐

