下面是我使用数组实现的简单队列。
#include<stdio.h>
#include<stdlib.h>
#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,因为最初在队列中,任何首先进入的条目也会成为最后一个条目。但是我的老师说我应该保留后面的条目为&#39; -1&#39;在将一个元素插入队列时,首先递增后面的入口索引,然后添加相反的第一个加法然后递增的代码。我在网上查看了它,直到现在我还没有发现我的错误。
如果我错了或我的老师在哪,请提供信息?
答案 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
)。
答案 1 :(得分:0)
周围有老师吗?好的,好的。
教师并不总是对的,但是你很可能只是误解了他。只要您了解当fe == re
队列为空时,0
最初都是正常的。
但是,您的某些功能需要更改:
删除强>
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)
。尝试从空队列中删除没什么可憎的。
答案 2 :(得分:0)
在插入函数中,当第一个检查队列为空或不是条件时:
if(r==0)
因为当队列为空时后方始终为0 .. 然后检查天气队列只有1个元素或多于1个..
if(f==r-1)
{f=0;r=0;}
else
{f++;}
插入函数中的当你插入最后一个元素时,你的后面会增加并设置为5 然后当你删除元素前面增加并且最后一个元素前面是4小于后面1 ...所以条件检查是否只剩下1个元素是f == r-1 如果满足则数组变为完全空,所以我们将前后设置为0 ..