【问题标题】:Find number of elements in a Circular Queue查找循环队列中的元素数
【发布时间】:2010-12-16 09:22:05
【问题描述】:

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

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

【问题讨论】:

  • 你的问题不是很清楚。遍历队列直到回到起点,边走边计算元素有什么问题?
  • 哪种语言?哪个图书馆?

标签: queue circular-list


【解决方案1】:

实际上尺寸应该是,

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

或者可以使用通用公式:

size = abs(abs(MAX - front) - abs(MAX -rear));//this works in every situation

【讨论】:

  • 通用公式不正确。当 head>tail 或 tail>=head 时,两者都不起作用。除此之外,根据循环队列的定义(MAX >= front,rear),不需要为 MAX-front 和 MAX-rear 设置绝对值。
【解决方案2】:

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

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

【讨论】:

    【解决方案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;
    

    【讨论】:

    • 抱歉,格式已关闭 - 我是新手。 '计数 = 0;'应该在单独的行上,嵌套的 if 语句行也应该...
    【解决方案4】:

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

    【讨论】:

    • 你能解释一下吗?
    • 这是错误的。不适用于循环队列。举任何 f>r 的例子。这个公式给出了错误的结果。
    【解决方案5】:

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

    【讨论】:

    • 或称为弗洛伊德的循环检测例程。
    【解决方案6】:

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

    FreeSpace = (printRdQue == printWrQue) ? PRINT_QUEUE_SIZE :
               (PRINT_QUEUE_SIZE - printWrQue + printRdQue) % PRINT_QUEUE_SIZE;
    

    【讨论】:

      【解决方案7】:

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

      a->b->c

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

      如果它不能多次包含同一个元素,只需在队列中查找,直到找到你已经看过的元素

      【讨论】:

        【解决方案8】:

        循环队列中的项目数是,

        size = (N-f+r) mod N
        

        在哪里

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

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

        【讨论】:

        • 你能解释一下这是如何得出的吗?
        • 这也将在队列已满时返回 0,应该返回 N
        • 在容量为 12 且 r = 1 ,f=3 的圆形数组中,您的公式给出 10 ,我认为应该有一个 +1
        【解决方案9】:
        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 ;
          }
        

        【讨论】:

          【解决方案10】:

          如果 (Cqueue_front>Cqueue_rear) cout

          【讨论】:

          • 请稍微描述一下。
          【解决方案11】:

          实现循环队列需要什么?

          答案:你需要前后节点 + 项目列表 + count_items。

          当然只有在队列有限的时候才会这样实现,在讨论的时候

          动态分配会有所不同。

          看一个C语言的例子,

          typedef struct
          {
          
          TYPE items[MAXSIZE];
          
          TYPE front;
          
          TYPE rear;
          
          int count_items;
          
          } QUEUE;
          

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

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

          【讨论】:

            【解决方案12】:

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

            【讨论】:

              【解决方案13】:

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

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

              front - (rear+1)
              

              否则front < rear:

              rear - front + 1
              

              如果需要,可以使用 C 程序:

                  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);
              }
              }
              

              【讨论】:

                【解决方案14】:

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

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

                                 { rear-front + n , otherwise 
                

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

                【讨论】:

                  【解决方案15】:

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

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2011-01-31
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2016-07-26
                    • 1970-01-01
                    相关资源
                    最近更新 更多