使用数组排队

时间:2014-08-17 03:55:27

标签: c arrays queue

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

#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;在将一个元素插入队列时,首先递增后面的入口索引,然后添加相反的第一个加法然后递增的代码。我在网上查看了它,直到现在我还没有发现我的错误。

如果我错了或我的老师在哪,请提供信息?

3 个答案:

答案 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)。

答案 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]);
}
  1. ==代替>
  2. return代替exit(0)
  3. <代替<=
  4. 插入

    if(re == QSIZE)                 // 1
    {
        printf("Queue Overflow\n");
        return;                     // 2
    }
    
    1. QSIZE代替QSIZE-1
    2. return代替exit(0)
    3. 删除

      没有理由拨打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 ..