首页 > 解决方案 > 循环队列显示

问题描述

void Queue::displayQueue() 
{ 
if (front == -1) 
{ 
    printf("\nQueue is Empty"); 
    return; 
} 
printf("\nElements in Circular Queue are: "); 
if (rear >= front) 
{ 
    for (int i = front; i <= rear; i++) 
        printf("%d ",arr[i]); 
} 
else // Why do I need two loops in this else?
{ 
    for (int i = front; i < size; i++) 
        printf("%d ", arr[i]); 

    for (int i = 0; i <= rear; i++) 
        printf("%d ", arr[i]); 
} 

为什么我不能只从前到后打印 i 而不是将其分成两行?

标签: c++data-structuresqueue

解决方案


您讨论过的实现......在该队列元素中可以有两种方式:

  1. 线性方式,如 [4, 3, 1, 2, <empty_pos>, <empty_pos>, <empty_pos>] 或
  2. 循环方式,如 [1, 2, <empty_pos>, <empty_pos>, <empty_pos>, 4, 3]

在后一种情况下,4是队列的前面并且2是队列的最后一个元素。所以,你可能会明白为什么前面的索引大于后面的索引......

此外,如果您编写如下代码,您可以只使用一个循环执行操作:

// no need to check with if/else, remove the if/else part and
// just do the following
for (int i = front; i != rear; i = ((i + 1) % size)) {
  printf("%d ",arr[i]); // print elem
}
if(size > 0) printf("%d ",arr[i]); // don't forget it, it prints the rear elem

推荐阅读