chapter-5 队列
特性
- 一种列表
- 只能在队尾插入元素,队首删除元素
- 存储按顺序排列的数据,先进先出(FIFO)
- 用于提交操作系统执行的一系列进程
主要操作
- 插入(入队)- 队尾插入新元素
- 删除(出队)- 删除队头元素
- 读取队头元素 - peek
- 存储多少元素 - length
- 清空所有元素 - clear
实现
|
|
测试结果:
使用
方块舞的舞伴分配问题
基数排序
- 9个队列,每个对应1-9每个数字,所有队列保存在一个数组里,使用取余和除法操作决定个位和十位。先根据个位数值对其排序,在根据十位数字排序呢,结果即为排序好的数字1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950/*** 分配函数* @param {array[num]} nums 排序数字数组* @param {array} queues 队列数组,每一项代表分配的基数数字* @param {int} n 进制* @param {int} digit 当前位数,1:个位、10:十*/function distribute (nums, queues, n, digit) {for (var i = 0; i < n; i++) {if (digit === 1) {queues[nums[i] % 10].enqueue(nums[i]);} else {queues[Math.floor(nums[i] / 10)].enqueue(nums[i]);}}}/*** 出队收集* @param {array} queues 队列数组* @param {array} nums 排序数组*/function collect(queues, nums) {// debuggervar i = 0;for (var digit = 0; digit < 10; digit++) {while (!queues[digit].empty()) {nums[i++] = queues[digit].dequeue();}}}// 执行程序var queues = [];for (var i = 0; i < 10; i++) {queues[i] = new Queue();}var nums = [];for (var i = 0; i < 10; i++) {nums[i] = Math.floor(Math.random() * 100);}console.log('原始数据:' + nums);// 个位分布排序distribute(nums, queues, 10, 1);collect(queues, nums);console.log('个位排序后数据:' + nums);// 十位分布排序distribute(nums, queues, 10, 10);collect(queues, nums);console.log('十位排序后数据:' + nums);
test 结果
优先队列
- 一般情况下,队列中删除的元素遵循先入先出的原则。
- 可以实现一个按优先权重限制的队列,高优先级先出,同优先级按先入先出处理。1234567891011121314151617181920212223242526272829303132333435363738394041424344454647/*** 存储队列元素* @param {*} name* @param {int} code 表示优先级*/function Patient (name, code) {this.name = name;this.code = code;}// 重新定义dequeue函数// 顺序查找方法寻找优先级最高的元素(code越小,优先级越高)function dequeue () {var entry = 0;for (var i = 0; i < this.dataStore.length;i++) {if (this.dataStore[i].code < this.dataStore[entry].code) {entry = i;}}return this.dataStore.splice(entry, 1);}Queue.prototype.dequeue = dequeue;// 主程序var ed = new Queue();// 数据var data = [['Smith', 5],['Jones', 4],['Fehrenbach', 6],['Brown', 1],['Ingram', 1]];// 入队for (var dd = 0; dd < data.length; dd++) {var p = new Patient(data[dd][0], data[dd][1]);ed.enqueue(p);}console.log('初始数据:' + JSON.stringify(ed.dataStore));// 出队var index = 0;while (!ed.empty()) {var seen = ed.dequeue();// debuggerdata[index++] = seen[0];}console.log('排序后数据:' + JSON.stringify(data));