使用数组的队列

下面是我使用数组实现的简单队列。

#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]; 

请记住,如果您预先增加插入,则需要预先增加以删除。

好的,考虑一下。 什么会发生fere都是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]); } 
  1. ==而不是>
  2. return而不是exit(0)
  3. <而不是<=

插入

 if(re == QSIZE) // 1 { printf("Queue Overflow\n"); return; // 2 } 
  1. QSIZE而不是QSIZE-1
  2. 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 ..