7

如何找到循环队列中的项目数?|前-后| 并不总是有效。

是否有一个公式可以知道使用数组的前后和大小的循环队列中有多少元素?

4

15 回答 15

8

实际上尺寸是,

size = front > rear ? (MAX - front + rear + 1) : (rear - front + 1);

或者可以使用通用公式:

size = abs(abs(MAX - front) - abs(MAX -rear));//this works in every situation
于 2011-11-06T12:06:19.587 回答
3
 Pointer1 = head; // (your node)
 count = 0;


 if( Pointer1 != NULL )
 {
   count = 1;
   Pointer2 = Pointer1->Next;
   while ( Pointer2 != NULL && Pointer2 != Pointer1 )
   {
     count++;
     Pointer2 = Pointer2->Next;
   }
 }

 return count;
于 2010-12-16T23:58:19.987 回答
3

假设您使用具有大小的数组来实现它,N因此有指向前后的指针。使用以下公式:

size = front > rear ? (front - rear) : (front+N -  rear);
于 2010-12-16T09:33:59.327 回答
2

假设您使用大小为 N 的数组进行队列实现,那么队列的大小将为 size = (N-front + rear) mod N.

于 2012-08-08T13:23:39.307 回答
1

标准答案是在开始时采用两个迭代器,第一个递增一次,第二个递增两次。检查它们是否指向同一个对象。然后重复直到增加两次的那个到达第一个或到达末尾。在这个循环中使用计数器来获取 CQuueeue 的长度

于 2011-01-27T08:36:57.710 回答
1

没有一个公式考虑空(零)情况。这将为您提供队列中可用的空闲字节数:

FreeSpace = (printRdQue == printWrQue) ? PRINT_QUEUE_SIZE :
           (PRINT_QUEUE_SIZE - printWrQue + printRdQue) % PRINT_QUEUE_SIZE;
于 2014-08-27T12:45:32.310 回答
0

您的队列可以在多个位置包含相同的元素吗?如果可以,那么我认为您不能这样做,因为无法知道以下两者之间的区别:

a->b->c

a->b->c->a->b->c

如果它不能多次包含相同的元素,只需查看队列,直到找到您已经看过的元素

于 2010-12-16T09:27:51.297 回答
0

循环队列中的项目数量为,

size = (N-f+r) mod N

在哪里

  • N 是以循环方式使用的数组的大小
  • f 前面元素的索引
  • r 索引紧随后元素

此公式适用于线性队列和循环队列。

于 2012-11-20T15:55:39.297 回答
0

实现循环队列需要什么?

答:您将需要前后节点 + 项目列表 + count_items。

当然只有在队列有限的情况下才这样实现,当谈到

动态分配就不同了。

看一个 C 语言中的例子,

typedef struct
{

TYPE items[MAXSIZE];

TYPE front;

TYPE rear;

int count_items;

} QUEUE;

这将确保您当前存在于队列中的项目的确切数量。

当你想向队列中插入一个项目时,你将简单地增加rear和count_items,当你想从队列中删除一个项目时,你只需减少rear和count_items。

于 2018-12-17T18:10:25.097 回答
0

if (Cqueue_front>Cqueue_rear) cout<<" 队列项数为:"<

于 2017-11-07T17:45:05.103 回答
0

计算循环队列中元素数量的最简单方法是:

如果front > rear(即前面比后面)只需计算其间的空格数

front - (rear+1)

否则如果front < rear

rear - front + 1

如果您需要 AC 程序:

    int find_ele(int total,int front,int rear){
         if(rear < front ) {  \\1st case
int res =    front - rear + 1;
return (total-res);}

else{
      return (rear - front + 1);
}
}
于 2020-09-30T05:31:33.833 回答
0
int lenghtQueue(queue* q){

     int len =0 ;
     if (isEmpty(q))
            return 0 ;

      queue* qe = q->next ;
      len ++ ;

       while(qe!=q){
             len ++ ;
             qe=qe->next ;           
       }
           return len ;
  }
于 2017-04-22T15:34:10.730 回答
0

number of elements = ((array_size - front + rear) MOD queue_size) + 1
假设front和rear保存了数组中前后元素的索引

于 2022-02-16T18:25:48.880 回答
0

不。元素数 = (后 + MAX_SIZE - 前) % MAX_SIZE + 1

于 2020-08-05T07:11:57.963 回答
0

假设您正在使用循环数组 A[0, n-1] 实现队列,其中第 (n-1) 个索引用于存储满/空条件,公式为:

元素数 = { 后前 + 1 ,如果后==前

                 { rear-front + n , otherwise 

我们将在每个入队或出队时顺时针移动队列。

于 2021-06-10T17:48:29.053 回答