数据结构学习笔记——队列(JavaScript版)

文章内容是我看完视频整理的,如有侵权请告知,我会删除

队列

队列是一种特殊的线性表,其特殊之处在于,它只允许在队列的头部删除元素,在队列的末尾添加新的元素,有着先进先出的特性。比如:排队

  • 一尾进
  • 一头出
  • 不允许插队

数据存储

从数据存储的角度看,实现栈的方式有两种:

  1. 以数组做基础
  2. 以链表做基础(这次笔记不涉及)

队列的方法

  • enqueue 从队列部添加一个元素
  • dequeue 从队列部删除一个元素
  • head 返回头部的元素(不是删除)
  • tail 返回队列尾节点
  • size 返回队列的大小
  • clear 清空队列
  • isEmpty 判断队列是否对空

代码实现

function Queue () {
    var items = []; // 存储数据

    // 从队列尾部添加一个元素
    this.enqueue = function (item) {
        items.push(item)
    }

    // 从队列头部删除一个元素
    this.dequeue = function () {
        return items.shift();
    }

    // 返回队列头部的元素
    this.head = function () {
        return items[0];
    }

    // 返回队列尾部的元素
    this.tail = function () {
        return items[items.length - 1];
    }

    // 返回队列大小
    this.size = function () {
        return items.length;
    }

    // 清空队列
    this.clear = function () {
        items.length = 0;
    }

    // 判断队列是否为空
    this.isEmpty = function () {
        return items.length === 0;
    }
}

列题

1. 约瑟夫环

要求: 有一个数组a[100]存放0-99。要求每隔两个数删除掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数。
思路

  • 对队列进行while循环,当队列中只剩一个数时停止
  • 设一个变量Index=0,每循环一次+1
  • 每次弹出队列中的第一个元素,如果index%3===0,则删除;否则把这个元素添加到队列尾部
function del_ring (arr) {
    var queue = new Queue();	// Queue是上面自定义的,不是原生就有的,这里我偷个懒没有再写一遍。
    // 把数组放入到队列中
    for (var i = 0; i < arr.length; i++) {
        queue.enqueue(arr[i]);
    }

    var index = 0;

    while (queue.size() != 1) {
        // 删除掉队列的第一个元素,并把它的值赋给item
        var item = queue.dequeue();
        index += 1;
        // 如果它的位置不能被3整除
        if (index % 3 != 0) {
            queue.enqueue(item);    // 就把他添加到队列尾部
        }
    }
    return queue.head();	// 返回最终的元素
}
// 数据
var arr_list = [];
for (var i = 0; i < 100; i++) {
    arr_list.push(i);
}

console.log(del_ring(arr_list));

参考

  • 开课吧视频
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值