큐는 일종의 목록입니다. 차이점은 큐의 끝에만 요소를 삽입하고 처음에 요소를 삭제할 수 있다는 것입니다. 큐는 스택(후입 선출)과 달리 선입선출 순서로 데이터를 저장하는 데 사용됩니다. 스택에서는 스택에 푸시된 마지막 요소가 먼저 처리됩니다. 이제 우리는 식당에 식사를 하러 갈 때처럼 줄을 상상할 수 있습니다. 많은 사람들이 식사를 하기 위해 줄을 서고, 앞에 있는 사람이 먼저 식사를 합니다. 신규 이민자는 뒤쪽에만 줄을 설 수 있습니다. 그들의 차례가 될 때까지. 본 글에서는 주로 자바스크립트 데이터 구조와 알고리즘에서 큐의 원리와 사용법을 소개하고, 큐의 개념과 원리를 좀 더 자세히 설명하며, 자바스크립트에서 큐를 구현하고 사용하기 위한 관련 운용 기술과 주의사항을 예시 형태로 분석한다. 도움이 필요한 경우 다음을 참조하세요. 모두에게 도움이 되기를 바랍니다.
1: 대기열 작업
대기열에는 두 가지 주요 작업이 있습니다. 대기열의 꼬리enqueue()메서드에 새 요소를 삽입하는 것과 대기열의 선두에 있는 요소를 삭제하는 것dequeue()입니다. 메서드 외에도 대기열의 앞부분을 읽는 요소도 있습니다. 이 메서드를 front() 메서드라고 부를 수 있습니다. 이 메서드는 헤드 요소와 기타 메서드를 반환합니다.
위 설명을 보면 배열에도 위의 메서드와 비슷한 기능을 하는 두 가지 메서드가 있다고 생각하는 분들이 많을 것입니다. 배열의 push()
메서드도 배열에 새로운 요소를 추가합니다. 배열의 뒷면 shift()
메서드는 배열의 첫 번째 요소를 삭제할 수 있습니다. 다음 코드: push()
方法也是往数组后面加入新元素,数组中shift()
方法则可以删除数组里面的第一个元素。如下代码:
var arrs = []; arrs.push("a"); arrs.push("b"); console.log(arrs); // ["a","b"]; arrs.shift(); console.log(arrs); // ['b'];
下面我们可以使用上面的数组中的push()
和shift()
的2个方法来封装我们的队列Queue类;
1. 我们可以先定义一个构造函数Queue类,如下:
function Queue() { this.dataStore = []; }
如上:this.dataStore = [];
function enqueue(element) { this.dataStore.push(element); }
아래에서는 위 배열의 push()
및 shift()
두 가지 메서드를 사용하여 대기열 Queue 클래스를 캡슐화할 수 있습니다.
function dequeue() { return this.dataStore.shift() }
this.dataStore = [];
빈 배열을 사용하면 대기열이 저장됩니다. 2. 팀의 꼬리에 요소를 추가하는 방법은 다음과 같습니다. function front() { return this.dataStore[0]; }
function back() { return this.dataStore[this.dataStore.length - 1]; }
function toString() { var retStr = ""; for(var i = 0; i < this.dataStore.length; ++i) { retStr += this.dataStore[i] + "\n"; } return retStr; }
function empty(){ if(this.dataStore.length == 0) { return true; }else { return false; } }
function Queue() { this.dataStore = []; } Queue.prototype = { // 向队尾添加一个元素 enqueue: function(element) { this.dataStore.push(element); }, // 删除队首的元素 dequeue: function(){ return this.dataStore.shift(); }, // 读取队首的元素 front: function(){ return this.dataStore[0]; }, // 读取队尾的元素 back: function(){ return this.dataStore[this.dataStore.length - 1]; }, // 显示队列内的所有元素 toString: function(){ var retStr = ""; for(var i = 0; i < this.dataStore.length; ++i) { retStr += this.dataStore[i] + "\n"; } return retStr; }, // 判断队列是否为空 empty: function(){ if(this.dataStore.length == 0) { return true; }else { return false; } } };
var q = new Queue(); q.enqueue("a"); q.enqueue("b"); q.enqueue("c"); console.log(q.toString()); // a b c q.dequeue(); console.log(q.toString()); // b c console.log("Front of queue:" +q.front()); // b console.log("Back of queue:" +q.back()); // c
var nums = ["50","12","95","7","90","3","74","81","91","72"];
이제 위 코드를 테스트할 수 있습니다.
queues[0] = 50 或者 90 queues[1] = 81 或者 91 queues[2] = 12 或者 72 queues[3] = 3 queues[4] = 74 queues[5] = 95 queues[6] queues[7] = 7 queues[8] queues[9]
두 가지: 대기열을 사용하여 데이터 정렬
nums = [50,90,81,91,12,72,3,74,95,7]
queues[5] = 50 queues[9] = 90 queues[8] = 81 queues[9] = 91 queues[1] = 12 queues[7] = 72 queues[0] = 3 queues[7] = 74 queues[9] = 95 queues[0] = 7
nums = [3,7,12,50,72,74,81,90,91,95];
/* * 根据个位或十位上的数值,将数字分配到相应队列的函数 * @param digit * digit=1 表示先按个位来分配 * digit = 10 表示是按十位来分配的 * @param n 表示循环比较多少次 一般数组几个数字就比较多少次 */ distribute: function(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]); } } }
마지막으로 상자에 있는 숫자를 꺼내서 정렬된 숫자인 새 목록을 만듭니다.
// 收集数字的函数 collect: function(queues,nums,n) { var i = 0; for(var digit = 0; digit < n; ++digit) { while(!queues[digit].empty()) { nums[i++] = queues[digit].dequeue(); } } }
function Queue() { this.dataStore = []; } Queue.prototype = { // 向队尾添加一个元素 enqueue: function(element) { this.dataStore.push(element); }, // 删除队首的元素 dequeue: function(){ return this.dataStore.shift(); }, // 读取队首的元素 front: function(){ return this.dataStore[0]; }, // 读取队尾的元素 back: function(){ return this.dataStore[this.dataStore.length - 1]; }, // 显示队列内的所有元素 toString: function(){ var retStr = ""; for(var i = 0; i < this.dataStore.length; ++i) { retStr += this.dataStore[i] + "\n"; } return retStr; }, // 判断队列是否为空 empty: function(){ if(this.dataStore.length == 0) { return true; }else { return false; } }, /* * 根据个位或十位上的数值,将数字分配到相应队列的函数 * @param digit * digit=1 表示先按个位来分配 * digit = 10 表示是按十位来分配的 * @param n 表示循环比较多少次 一般数组几个数字就比较多少次 */ distribute: function(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]); } } }, // 收集数字的函数 collect: function(queues,nums,n) { var i = 0; for(var digit = 0; digit < n; ++digit) { while(!queues[digit].empty()) { nums[i++] = queues[digit].dequeue(); } } }, dispArray: function(arr) { for(var i = 0; i < arr.length; ++i) { console.log(arr[i]); } } };
var q = new Queue(); q.enqueue("a"); q.enqueue("b"); q.enqueue("c"); console.log(q.toString()); q.dequeue(); console.log(q.toString()); console.log("Front of queue:" +q.front()); console.log("Back of queue:" +q.back()); var queues = []; for(var i = 0; i < 10; ++i) { queues[i] = new Queue(); } var nums = ["50","12","95","7","90","3","74","81","91","72"]; console.log("before radix sort: "); console.log(nums); q.distribute(nums,queues,10,1); q.collect(queues,nums,10); q.dispArray(nums); console.log("分割线"); q.distribute(nums,queues,10,10); q.collect(queues,nums,10); q.dispArray(nums);
var q = new Queue(); q.enqueue("a"); q.enqueue("b"); q.enqueue("c"); console.log(q.toString()); q.dequeue(); console.log(q.toString()); console.log("Front of queue:" +q.front()); console.log("Back of queue:" +q.back()); var queues = []; for(var i = 0; i < 10; ++i) { queues[i] = new Queue(); } var nums = ["50","12","95","7","90","3","74","81","91","72"]; console.log("before radix sort: "); console.log(nums); q.distribute(nums,queues,10,1); q.collect(queues,nums,10); q.dispArray(nums); console.log("分割线"); q.distribute(nums,queues,10,10); q.collect(queues,nums,10); q.dispArray(nums);
相关推荐:
위 내용은 JavaScript 대기열 원칙 및 사용 예에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!