循环队列插入异常:插入第2个元素时误报队列已满(数组大小5)
解决你的循环队列插入问题
兄弟,我一眼就瞅出你代码里的两个关键问题,正是它们导致你插入第一个元素后就触发“队列已满”的错误提示:
1. 条件判断里的赋值运算符误用
你看insert函数里的这个判断:
if(front=rear+1 || SIZE==rear+1)
这里的front=rear+1是赋值操作(用了=),而不是你想要的比较操作(应该用==)。每次执行这个判断时,程序会把rear+1的值赋给front,然后判断这个赋值结果是否为真(非零即真)。
插入第一个元素后,rear的值是0,这时候front被赋值为1,这个值非零,所以整个if条件直接成立,就会打印“队列已满”的提示,根本不会执行后面的插入逻辑。
2. 循环队列满的判断逻辑错误
原代码的满队列判断逻辑完全不符合循环队列的特性。循环队列的核心是利用取模运算实现“循环”,正确的满队列判断条件应该是:
(rear + 1) % SIZE == front
这个条件的意思是:当rear的下一个位置就是front时,队列已经满了(循环队列通常会预留一个空位置来区分“满”和“空”的状态,避免和初始空队列的front == rear混淆)。
原代码里的SIZE==rear+1只考虑了rear走到数组末尾的情况,没有考虑循环回到数组开头的场景,而且结合前面的赋值错误,直接导致了错误触发。
修正后的完整代码
#include<stdio.h> #include<stdlib.h> #define SIZE 5 int cqueue[SIZE]; int front = -1; int rear = -1; void insert(int); void main() { int ch,item; while(1) { printf("\n select choice from given below operations of circular queue : "); printf("\n 1.insert element"); printf("\n 2. delete element"); printf("\n 3. display elements"); printf("\n 4. exit"); printf("\n enter choice : "); scanf("%d",&ch); switch(ch) { case 1 : printf("enter element : "); scanf("%d",&item); insert(item); break; case 4 : exit(0); default: printf("\ninvalid choice! enter again\n"); } } } void insert(int ele) { // 修正满队列判断条件,把=改成==,并用取模实现循环判断 if((rear + 1) % SIZE == front) { printf("\n circular queue is full "); } else if((rear==-1)&&(front==-1)) { front=rear=0; cqueue[rear]=ele; } else if(rear==SIZE-1) { rear=0; cqueue[rear]=ele; } else { rear++; cqueue[rear]=ele; } }
测试验证
- 插入第一个元素:
front和rear都设为0,(0+1)%5=1 !=0,不会触发满队列提示。 - 插入第二个元素:
rear变为1,(1+1)%5=2 !=0,正常插入。 - 直到插入第5个元素后,
rear是4,(4+1)%5=0 == front(此时front还是0),才会提示队列已满,这符合循环队列的预期行为。
内容的提问来源于stack exchange,提问作者Tushar Sharma
相关产品推荐
相关产品推荐

