【发布时间】:2010-12-16 09:22:05
【问题描述】:
如何找到循环队列中的项目数? |前-后|并不总是有效。
有没有一个公式可以使用数组的前、后和大小来知道循环队列中有多少元素?
【问题讨论】:
-
你的问题不是很清楚。遍历队列直到回到起点,边走边计算元素有什么问题?
-
哪种语言?哪个图书馆?
标签: queue circular-list
如何找到循环队列中的项目数? |前-后|并不总是有效。
有没有一个公式可以使用数组的前、后和大小来知道循环队列中有多少元素?
【问题讨论】:
标签: queue circular-list
实际上尺寸应该是,
size = front > rear ? (MAX - front + rear + 1) : (rear - front + 1);
或者可以使用通用公式:
size = abs(abs(MAX - front) - abs(MAX -rear));//this works in every situation
【讨论】:
假设您使用大小为N 的数组来实现它,因此有指向前后的指针。使用以下公式:
size = front > rear ? (front - rear) : (front+N - rear);
【讨论】:
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;
【讨论】:
假设您使用大小为 N 的数组来实现队列,那么队列的大小将是
size = (N-front + rear) mod N.
【讨论】:
标准答案是在开始时采用两个迭代器,第一个递增一次,第二个递增两次。 检查它们是否指向同一个对象。然后重复直到增加两次的那个到达第一个或到达末尾。在这个循环中使用计数器来获取 CQuueeue 的长度
【讨论】:
没有一个公式考虑空(零)情况。这将为您提供队列中可用的空闲字节数:
FreeSpace = (printRdQue == printWrQue) ? PRINT_QUEUE_SIZE :
(PRINT_QUEUE_SIZE - printWrQue + printRdQue) % PRINT_QUEUE_SIZE;
【讨论】:
您的队列可以在多个位置包含相同的元素吗?如果可以,那么我认为您不能这样做,因为没有办法知道两者之间的区别:
a->b->c
和
a->b->c->a->b->c
如果它不能多次包含同一个元素,只需在队列中查找,直到找到你已经看过的元素
【讨论】:
循环队列中的项目数是,
size = (N-f+r) mod N
在哪里
此公式适用于线性队列和循环队列。
【讨论】:
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 ;
}
【讨论】:
如果 (Cqueue_front>Cqueue_rear) cout
【讨论】:
实现循环队列需要什么?
答案:你需要前后节点 + 项目列表 + count_items。
当然只有在队列有限的时候才会这样实现,在讨论的时候
动态分配会有所不同。
看一个C语言的例子,
typedef struct
{
TYPE items[MAXSIZE];
TYPE front;
TYPE rear;
int count_items;
} QUEUE;
这将向您保证队列中当前存在的项目的确切数量。
当你想向队列中插入一个项目时,你只需增加rear和count_items,当你想从队列中删除一个项目时,你只需减少rear和count_items。
【讨论】:
没有。元素数 = (后 + MAX_SIZE - 前) % MAX_SIZE + 1
【讨论】:
计算循环队列中元素个数的最简单方法是:
如果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);
}
}
【讨论】:
假设您正在使用循环数组 A[0, n-1] 实现一个队列,其中第 (n-1) 个索引用于存储满/空条件,公式为:
元素数 = { 后前 + 1 ,如果后==前
{ rear-front + n , otherwise
我们将在每个入队或出队时顺时针移动队列。
【讨论】:
number of elements = ((array_size - front + rear) MOD queue_size) + 1
假设front和rear保存了数组中前后元素的索引
【讨论】: