循环队列数据结构

本文介绍循环队列数据结构,最后我们用C代码进行实现。循环队列是正常队列的扩展,其最后元素连接第一个元素,这样形成类似环的数据结构。循环队列的应用包括CPU调度、内存管理以及流量管控等。

循环队列定义

循环队列主要为解决正常队列的限制。正常队列在执行插入和删除动作之后,会产生不可用的空间。

| 在这里插入图片描述
|
| :----------------------------------------------------------: |
| 正常队列信息 |

这里索引 0 和 1 位置只有重置队列(删除所有元素)才能使用,因此实际能使用的空间比队列容量小。因为正常队列增加元素是会根据尾指针位置判断是否已满,因为尾指针指向最后,所以不能增加新的元素,但实际对头还有空闲空间。

循环队列就是为了解决正常队列限制,其最后元素连接第一个元素,这样形成类似环的数据结构。

|在这里插入图片描述
|
| :----------------------------------------------------------: |
| 循环队列图示 |

循环队列的工作过程是循环递增的,也就是说,当递增指针到达队列的末尾时,即从队列的开头重新开始。循环递增是通过对队列大小进行取模来实现。

if REAR + 1 == 5 (overflow!), REAR = (REAR + 1)%5 = 0 (start of queue)

循环队列操作

循环队列主要有下面约定:

  • 两个指针 frontrear
  • front 跟踪队列首元素
  • rear 跟踪队尾元素
  • 初始设置frontrear值为-1

入队操作

  • 检查队列是否已满
  • 如果是第一个元素,设置front 为 0
  • 循环递增 rear(如果到达结尾,下面位置为队首)
  • 增加新的元素在 rear位置

出队操作

  • 检查队列是否为空
  • 返回front 位置元素
  • 循环递增front
  • 如果是最后一个元素,重新设置frontrear值为-1

但检查队列已满的条件有两种情况:

  • FRONT = 0 && REAR == SIZE - 1
  • FRONT = REAR + 1

第一种情况是增加元素,直到占满空间。第二种情况先出队,然后继续入队。如下图所示:

| 在这里插入图片描述
|
| :----------------------------------------------------------: |
| 循环队列入队和出队操作 |

数据结构采用不同语言差异不大,这里给出C代码实现如下:

#define SIZE 5

#include<stdio.h>

int items[SIZE];
int front = -1, rear = -1;

// Check if the queue is full
int isFull() {
  if ((front == rear + 1) || (front == 0 && rear == SIZE - 1)) return 1;
  return 0;
}

// Check if the queue is empty
int isEmpty() {
  if (front == -1) return 1;
  return 0;
}

// Adding an element
void enQueue(int element) {
  if (isFull())
    printf("\n Queue is full!! \n");
  else {
    if (front == -1) front = 0;
    rear = (rear + 1) % SIZE;
    items[rear] = element;
    printf("\n Inserted -> %d", element);
  }
}

// Removing an element
int deQueue() {
  int element;
  if (isEmpty()) {
    printf("\n Queue is empty !! \n");
    return (-1);
  } else {
    element = items[front];
    if (front == rear) {
      front = -1;
      rear = -1;
    } 
    // Q has only one element, so we reset the 
    // queue after dequeing it. ?
    else {
      front = (front + 1) % SIZE;
    }
    printf("\n Deleted element -> %d \n", element);
    return (element);
  }
}

// Display the queue
void display() {
  int i;
  if (isEmpty())
    printf(" \n Empty Queue\n");
  else {
    printf("\n Front -> %d ", front);
    printf("\n Items -> ");
    for (i = front; i != rear; i = (i + 1) % SIZE) {
      printf("%d ", items[i]);
    }
    printf("%d ", items[i]);
    printf("\n Rear -> %d \n", rear);
  }
}

int main() {
  // Fails because front = -1
  deQueue();

  enQueue(1);
  enQueue(2);
  enQueue(3);
  enQueue(4);
  enQueue(5);

  // Fails to enqueue because front == 0 && rear == SIZE - 1
  enQueue(6);

  display();
  deQueue();

  display();

  enQueue(7);
  display();

  // Fails to enqueue because front == rear + 1
  enQueue(8);

  return 0;
}

总结

我们采用数组实现,因此循环队列的入队和出队操作时间复杂度为O(1) 。参考文档:https://www.programiz.com/dsa/circular-queue

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
)。 杨辉三角形是一个由数字组成的三角形,数字排列成类似于三角形的形状,数字的顶部是1,数字的每一行由上一行的相邻元素相加得到。 例如,下面是一个4行的杨辉三角形: 1 1 1 1 2 1 1 3 3 1 实现思路: 1. 定义一个循环队列,队列中每个元素都是一个数组,用来存储杨辉三角形中的每一行; 2. 首先将第一行的数组放入队列中; 3. 从第二行开始,依次计算每个元素的值,并将该行的数组放入队列中; 4. 最后,遍历队列,将杨辉三角形打印出来即可。 代码如下: ```python class Queue: def __init__(self, capacity): self.capacity = capacity self.front = 0 self.rear = 0 self.queue = [None] * capacity def is_empty(self): return self.front == self.rear def is_full(self): return (self.rear + 1) % self.capacity == self.front def enqueue(self, item): if self.is_full(): return False self.queue[self.rear] = item self.rear = (self.rear + 1) % self.capacity return True def dequeue(self): if self.is_empty(): return None item = self.queue[self.front] self.front = (self.front + 1) % self.capacity return item def size(self): return (self.rear - self.front + self.capacity) % self.capacity def clear(self): self.front = 0 self.rear = 0 def yanghui_triangle(n): q = Queue(n) q.enqueue([1]) # 第一行 for i in range(2, n+1): prev_row = q.dequeue() curr_row = [1] * i for j in range(1, i-1): curr_row[j] = prev_row[j-1] + prev_row[j] q.enqueue(curr_row) while not q.is_empty(): row = q.dequeue() print(' ' * (n - len(row)), end='') for num in row: print(num, end=' ') print() # 测试 yanghui_triangle(4) ``` 输出结果为: ``` 1 1 1 1 2 1 1 3 3 1 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值