文章内容是我看完视频整理的,如有侵权请告知,我会删除
队列
队列是一种特殊的线性表,其特殊之处在于,它只允许在队列的头部删除元素,在队列的末尾添加新的元素,有着先进先出的特性。比如:排队
- 一尾进
- 一头出
- 不允许插队
数据存储
从数据存储的角度看,实现栈的方式有两种:
- 以数组做基础
- 以链表做基础(这次笔记不涉及)
队列的方法
- 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));
参考
- 开课吧视频