使用数组的队列
下面是我使用数组实现的简单队列。
#include #include #define QSIZE 5 //Limit size of queue to just 5 enteries /*Beginning of prototype for queue functions: Insert, retrieve and display*/ void qdisp(); //Display to queue array contents void qinsert(); //Insert a element into rear of queue int qdelete(); //Remove an element from front of queue /*End of prototyping*/ // Variables int fe=0,re=0,q[QSIZE],item; //fe(front entry), re(rear entry), q[](queue array), item(element to i/p or delete) void main() { int choice; while(1) { printf("1.Insert element\n2.Remove element\n3.Display element(s)\n4.Exit program\nEnter number for appropriate choice: "); scanf("%d",&choice); switch(choice) { case 1: printf("Enter value of element: "); scanf("%d",&item); qinsert(); break; case 2: item=qdelete(); printf("Removed \'%d\' from the queue\n",item); break; case 3: qdisp(); break; case 4: exit(0); /*case default : printf("Wrong choice i/p!"); break;*/ } } } //End of main, beginning for function definitons void qinsert() { if(re==QSIZE-1) { printf("Queue Overflow\n"); exit(0); } q[re]=item; re++; } int qdelete() { if(fe>re) { printf("Queue is empty!\n"); exit(0); } item=q[fe]; fe++; return item; } void qdisp() { int i; //i is loop counter variable if(fe>re) { printf("Queue is empty!\n"); exit(0); } printf("Queue items are: \n"); for(i=fe;i<=re;i++) printf("%d\n",q[i]); }
我将初始前后条目用作0,因为最初在队列中,任何首先进入的条目也成为最后一个条目。 但是我的老师说我应该将后面的条目保持为’-1’并且在将一个元素插入队列时,首先递增后面的条目索引,然后添加相反的我的代码,先添加然后递增。 我在网上查看它,直到现在我都没有发现我错了。
如果我错了或者我的老师,请提供信息?
可以在队列中使用预递增和后递增。 然而,完全和空洞的条件发生了什么变化。 通过预增量,满条件为QSIZE-1
,后增量满条件为QSIZE
。 通过预增量,空条件是fe==re
,后增量fe>re
。
使用预增量可以在删除时保存临时变量。 注意如何将当前元素保存到item中,然后递增索引,然后返回item。
item=q[fe]; fe++; return item;
您可以通过递增索引, 然后返回元素来取消item
变量。
fe++; return q[fe];
请记住,如果您预先增加插入,则需要预先增加以删除。
好的,考虑一下。 什么会发生fe
和re
都是QSIZE-1
? 队列为空,但您的代码会将其解释为已满(因为re==QSIZE-1
)。
周围有老师吗? 好的。
教师并不总是对的,但你很可能只是误解了他。 只要您了解当fe == re
队列为空时,最初都为0
就好了。
但是,您的一些function需要更改:
删除
void qdisp(void) { int i; if(fe == re) // 1 { printf("Queue is empty!\n"); return; // 2 } printf("Queue items are:\n"); for(i = fe; i < re; i++) // 3 printf("%d\n", q[i]); }
-
==
而不是>
-
return
而不是exit(0)
-
<
而不是<=
插入
if(re == QSIZE) // 1 { printf("Queue Overflow\n"); return; // 2 }
-
QSIZE
而不是QSIZE-1
-
return
而不是exit(0)
删除
没有理由调用exit(0)
。 尝试从空队列中删除没有什么致命的。
在插入函数中,当第一个检查队列为空或不是条件时:
if(r==0)
因为当队列为空时,后面始终为0 ..然后检查天气队列只有1个元素或多于1个。
if(f==r-1) {f=0;r=0;} else {f++;}
在插入function中,当你插入最后一个元素时你的后方会增加并设置为5然后当你删除元素前面增加而最后一个元素前面是4则小于后面1 …所以条件检查是否只剩下1个元素或者不是f == r-1,如果满足则数组变为完全空,所以我们将前后设置为0 ..