带你读《图解算法小抄》十八、队列(3)

简介: 带你读《图解算法小抄》十八、队列(3)

带你读《图解算法小抄》十八、队列(2)https://developer.aliyun.com/article/1348048?groupCode=tech_library


3.设计循环队列


设计一个循环队列(Circular Queue)实现类 MyCircularQueue,该类应支持以下操作:

  • MyCircularQueue(k):构造函数,初始化队列的大小为 k。
  • enQueue(value):向循环队列插入一个元素。如果成功插入则返回 true,否则返回 false。
  • deQueue():从循环队列中删除一个元素。如果成功删除则返回 true,否则返回 false。
  • Front():获取队列的第一个元素。如果队列为空,返回 -1。
  • Rear():获取队列的最后一个元素。如果队列为空,返回 -1。
  • isEmpty():检查循环队列是否为空。
  • isFull():检查循环队列是否已满。

 

示例:

 

MyCircularQueue circularQueue = new MyCircularQueue(3); // 设置队列长度为 3
circularQueue.enQueue(1);  // 返回 true
circularQueue.enQueue(2);  // 返回 true
circularQueue.enQueue(3);  // 返回 true
circularQueue.enQueue(4);  // 返回 false,队列已满
circularQueue.Rear();      // 返回 3
circularQueue.isFull();    // 返回 true
circularQueue.deQueue();   // 返回 true
circularQueue.enQueue(4);  // 返回 true
circularQueue.Rear();      // 返回 4

2题目分析与解题步骤:

这个问题可以使用数组来实现循环队列。我们需要使用两个指针 front 和 rear 分别指向队列的头部和尾部。

 

解题步骤如下:

 

  • 创建一个数组 queue 用于存储队列的元素,以及两个指针 front 和 rear。
  • 在构造函数 MyCircularQueue(k) 中,初始化数组 queue 的大小为 k,并将指针 front 和 rear 初始化为 0。
  • 实现方法 enQueue(value),在向队列插入元素之前,需要先判断队列是否已满。如果队列已满,返回 false。否则,将元素插入到队列的尾部,并将 rear 后移一位,返回 true。
  • 实现方法 deQueue(),在删除队列元素之前,需要先判断队列是否为空。如果队列为空,返回 false。否则,将队列头部元素删除,并将 front 后移一位,返回 true。
  • 实现方法 Front(),如果队列为空,返回 -1。否则,返回队列头部元素 queue[front]。
  • 实现方法 Rear(),如果队列为空,返回 -1。否则,返回队列尾部元素 queue[rear - 1]。
  • 实现方法 isEmpty(),检查队列是否为空。如果 front 和 rear 指针相等,表示队列为空,返回 true,否则返回 false。
  • 实现方法 isFull(),检查队列是否已满。如果 (rear + 1) % k === front,表示队列已满,返回 true,否则返回 false。

2JavaScript解题框架:

class MyCircularQueue {
  constructor(k) {
    this.queue = new Array(k);
    this.front = 0;
    this.rear = 0;
  }  enQueue(value) {
    if (this.isFull()) {
      return false;
    }
    this.queue[this.rear] = value;
    this.rear = (this.rear + 1) % this.queue.length;
    return true;
  }  deQueue() {
    if (this.isEmpty()) {
      return false;
    }
    this.front = (this.front + 1) % this.queue.length;
    return true;
  }  Front() {
    if (this.isEmpty()) {
      return -1;
    }
    return this.queue[this.front];
  }  Rear() {
    if (this.isEmpty()) {
      return -1;
    }
    return this.queue[(this.rear - 1 + this.queue.length) % this.queue.length];
  }  isEmpty() {
    return this.front === this.rear;
  }  isFull() {
    return (this.rear + 1) % this.queue.length === this.front;
  }}

 

在这个框架中,我们使用数组 queue 来存储队列的元素,并使用指针 front rear 分别指向队列的头部和尾部。

 

根据题目要求,我们实现了构造函数 MyCircularQueue(k) 和各种方法,包括入队、出队、获取队列头部元素、获取队列尾部元素、检查队列是否为空、检查队列是否已满等。

相关文章
|
1月前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
6月前
|
算法 C语言
【数据结构与算法 经典例题】使用栈实现队列(图文详解)
【数据结构与算法 经典例题】使用栈实现队列(图文详解)
|
6月前
|
存储 算法
【数据结构和算法】--队列的特殊结构-循环队列
【数据结构和算法】--队列的特殊结构-循环队列
35 0
|
2月前
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
26 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
|
3月前
|
存储 算法 前端开发
深入理解操作系统:进程调度与优先级队列算法
【9月更文挑战第25天】在操作系统的复杂世界中,进程调度是维持系统稳定运行的核心机制之一。本文将深入探讨进程调度的基本概念,分析不同的进程调度算法,并着重介绍优先级队列算法的原理和实现。通过简洁明了的语言,我们将一起探索如何优化进程调度,提高操作系统的效率和响应速度。无论你是计算机科学的初学者还是希望深化理解的专业人士,这篇文章都将为你提供有价值的见解。
|
4月前
|
缓存 算法 Java
刷算法,你应该知道的队列经典应用
文章介绍了队列的基本特性和经典应用,包括如何用队列实现栈、使用优先级队列解决Top K问题,并通过LeetCode题目示例展示了队列在算法实现中的应用。
刷算法,你应该知道的队列经典应用
|
4月前
|
算法
【数据结构与算法】优先级队列
【数据结构与算法】优先级队列
20 0
|
4月前
|
存储 算法
【数据结构与算法】队列(顺序存储)
【数据结构与算法】队列(顺序存储)
35 0
|
6月前
|
算法 C语言
【数据结构与算法 经典例题】使用队列实现栈(图文详解)
【数据结构与算法 经典例题】使用队列实现栈(图文详解)
|
6月前
|
算法
【C/数据结构和算法】:栈和队列
【C/数据结构和算法】:栈和队列
52 1