Leecode 622. 设计循环队列(相当详细的JavaScript版)

24 篇文章 0 订阅
这篇博客详细介绍了循环队列的工作原理,通过JavaScript实现了一个名为MyCircularQueue的数据结构。该结构包括enQueue(入队)、deQueue(出队)、Front(获取队首元素)、Rear(获取队尾元素)、isEmpty(检查队列是否为空)和isFull(检查队列是否已满)等基本操作。循环队列利用取余运算处理队首和队尾的边界,确保在队列满或空时能正确操作。
摘要由CSDN通过智能技术生成

先看一下这个循环队列的运作方式

在这里插入图片描述

现在可以看代码了(对照着途中的红字就可以理解isEmpty、isFull两个函数了 )

/**
 * @param {number} k
 */
var MyCircularQueue = function(k) {
	// 创建一个长度为k的数组
    this.list = new Array(k)
    // 用来存储数组的容量
    this.maxLength = k
    // 记录队首的位置
    this.tou = 0
    // 记录队尾的位置
    this.wei = 0
};

/** 
 * @param {number} value
 * @return {boolean}
 */
MyCircularQueue.prototype.enQueue = function(value) {
    if(this.isFull()){
        return false
    }else{
        this.list[this.wei] = value
        // 假如数组长度是5 此队尾指向的是4 那么在插入新的值后队尾应该指向下标0 所以运用取余的方式来使下标回到0
        this.wei = (this.wei+1)%this.maxLength
        return true
    }
};

/**
 * @return {boolean}
 */
MyCircularQueue.prototype.deQueue = function() {
    if(this.isEmpty()){
        return false
    }else{
        this.list[this.tou] = null
        // 假如数组长度是5 此队首指向的是4 那么在删除队首的值后队首应该指向下标0 所以运用取余的方式来使下标回到0
        this.tou = (this.tou+1)%this.maxLength
        return true
    }
};

/**
 * @return {number}
 */
MyCircularQueue.prototype.Front = function() {
    if(this.isEmpty()){
        return -1
    }else{
        return this.list[this.tou]
    }
};

/**
 * @return {number}
 */
MyCircularQueue.prototype.Rear = function() {
    if(this.isEmpty()){
        return -1
    }else{
        // 假如数组长度是5 并且此时队尾处于0 那说明真正的队尾在数组下标为4的地方
        return this.list[(this.wei-1)<0?this.maxLength-1:this.wei-1]
    }
};

/**
 * @return {boolean}
 */
MyCircularQueue.prototype.isEmpty = function() {
    // 记录队首队尾的值一样并且数组在此处的值已经为空了就代表数组已经空了
    return this.tou==this.wei && !this.list[this.tou]
};

/**
 * @return {boolean}
 */
MyCircularQueue.prototype.isFull = function() {
    // 记录队首队尾的值一样并且数组在此处的值已经不为空就代表数组已经满了
    return this.tou==this.wei && !!this.list[this.tou]
};

/**
 * Your MyCircularQueue object will be instantiated and called as such:
 * var obj = new MyCircularQueue(k)
 * var param_1 = obj.enQueue(value)
 * var param_2 = obj.deQueue()
 * var param_3 = obj.Front()
 * var param_4 = obj.Rear()
 * var param_5 = obj.isEmpty()
 * var param_6 = obj.isFull()
 */
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会回答你的问题,以下是关于字符循环队列的相关内容: 1. 字符循环队列存储结构的表示: 字符循环队列的存储结构可以使用数组来实现,需要定义一个数组和两个指针,分别指向队头和队尾。此外,还需要定义一个最大容量的变量,用来限制队列的大小。 typedef struct { char data[MAXSIZE]; int front; int rear; } SqQueue; 2. 字符循环队列初始化为空队列: 字符循环队列初始化为空队列的操作比较简单,只需要将队头和队尾指针都指向0即可。 void InitQueue(SqQueue *Q) { Q->front = 0; Q->rear = 0; } 3. 字符循环队列遍历和输出循环队列的所有元素: 字符循环队列的遍历可以使用循环来实现,从队头指针开始循环遍历到队尾指针,输出每一个元素。 void TraverseQueue(SqQueue Q) { int i; for (i = Q.front; i != Q.rear; i = (i+1)%MAXSIZE) { printf("%c ", Q.data[i]); } printf("\n"); } 4. 字符循环队列循环队列队头元素,返回其值: 取循环队列队头元素的操作比较简单,只需要返回队头指针所指向的元素即可。 char GetHead(SqQueue Q) { if (Q.front == Q.rear) { printf("Queue is empty.\n"); return 0; } return Q.data[Q.front]; } 5. 字符循环队列循环队列入队操作,队尾插入新元素: 字符循环队列的入队操作需要将新元素插入到队尾指针所指向的位置,同时更新队尾指针。 int EnQueue(SqQueue *Q, char x) { if ((Q->rear + 1) % MAXSIZE == Q->front) { printf("Queue is full.\n"); return 0; } Q->data[Q->rear] = x; Q->rear = (Q->rear + 1) % MAXSIZE; return 1; } 6. 字符循环队列循环队列出队操作,删除队头元素: 字符循环队列的出队操作需要删除队头指针所指向的元素,同时更新队头指针。 int DeQueue(SqQueue *Q) { if (Q->front == Q->rear) { printf("Queue is empty.\n"); return 0; } Q->front = (Q->front + 1) % MAXSIZE; return 1; } 以上是关于字符循环队列的相关内容,希望可以帮到你。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值