当前位置: 首页 > 知识库问答 >
问题:

使用数组的队列

龚宏壮
2023-03-14
#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,因为最初在队列中,任何先进入的条目也将成为最后一个条目。然而,我的老师说我应该保持后面的条目为'-1',当插入一个元素到队列中时,首先增加后面的条目索引,然后添加,反对我的代码先添加后增加。我在网上查了一下,直到现在我也不知道我怎么错了。

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

共有1个答案

龙越彬
2023-03-14

预递增和后递增都可以在队列中使用。然而,变化的是满和空的条件。在预增量中,完整条件是qsize-1,在后增量中,完整条件是qsize。对于预增量,空条件是fe==re,对于后增量fe>re

使用pre-increment可以在delete中保存临时变量。注意必须如何将当前元素保存到item,然后递增索引,然后返回item。

item=q[fe];
fe++;
return item;

您可以通过增加索引,然后返回元素来取消item变量。

fe++;
return q[fe];
 类似资料:
  • 我正在从Sahni的“C语言数据结构基础”中学习数据结构。在使用动态数组的循环队列中,作者提到了以下几点, 假设capacity是循环队列的初始容量,我们必须首先使用realloc增加数组的大小,这将把最大容量元素复制到新的数组中。为了获得正确的循环队列配置,我们必须将右段中的元素(即元素a和B)滑动到数组的右端(参见图3.7.d)。数组加倍和向右滑动一起最多复制2*容量-2个元素。

  • 我很困惑为什么我的队列不工作,我相信排队和退队方法中存在问题。但是我不确定,我应该实现初始数组大小设置为8的类。一旦元素数量超过该大小,数组大小将加倍。从数组开头移除元素后,需要将数组中的所有元素向左移动一个位置。编写一个测试程序,将从1到20的20个数字添加到队列中,然后删除这些数字并显示它们。这是我的密码 这里是测试类。

  • 我想通过数组的第二个元素[0,30],[5,10],[15,20]进行比较。 但我得到一个错误如下 第8行:错误:需要数组,但找到了对象PriorityQueue ^2个错误

  • 这是一道古老的考题。 在什么条件下(V, E),我们应该实现的Prim的算法使用数组(索引的顶点)而不是堆(与对数时间实现的提取最小和减少关键操作)的最小优先级队列? 在什么条件下(V,E),我们应该使用有序数组实现Prim算法的最小优先级队列?

  • 假设我有一个大小为[10]的数组,当该数组被填满时,我想实现一个FIFO结构,而不是它只是填满了,因此无法向数组中添加新的东西,并抛出旧的东西。 例如,如果我有一个包含汽车制造商的字符串数组,当我的数组中有10个制造商时,我希望删除最旧的条目,添加最新的条目,但要考虑kepping FIFO。我如何在这样的方法中实现它:

  • 我们的环境由3个jboss服务器组成(门户、jms、协调)。 协调服务器托管骆驼路由,该路由具有消耗自队列(SLAQueue)的路由 JMS服务器托管了我们的所有队列 最近,我们发现了一个错误,即托管在JMS服务器上的TaskQueue中的一些消息没有传递到门户服务器上的MDB。由于某些原因,它们被卡住了,当我们重新启动JMS服务器时,卡住的消息被传递 为了进行调查,我们在“org.apache.