JavaScriptキュー構造Queはプロセス解析を実現します。
7533 ワード
一、行列案内
キューは制限された線形表であり、先入れ先出し(FIFO:first in first out)が特徴である。
制限されているのは、表の先端のみで削除操作が許可されていることです。表のバックエンドに挿入操作を行います。
列に並んで切符を買うのと同じです。先に来たのは先に切符を買います。後から切符を買います。
キューのアプリケーション:
印刷キュー:複数のファイルをコンピュータで印刷する場合は、整列印刷が必要です。スレッドキュー:マルチスレッドを開くと、新しいスレッドが必要なリソースが足りない場合は、先にスレッドキューに入れて、CPU処理を待つ。
キュークラスの実装:
キューの実装はスタックと同じで、2つの案があります。
配列に基づいて実現する。チェーンに基づいて実現する;
キューの一般的な操作: enqueue(element):新しいエントリをキューの末尾に追加します。 dequeue():列の最初のエントリを削除し、削除された要素を返します。 front():キューに戻る最初の要素――最初に追加されても、最初に除去される要素である。キューは何も変更されません(要素を除去せずに、要素情報だけを元に戻すのはStck類のpeek方法と非常に似ています)。 isEmpty():もしキューに要素が含まれていないなら、trueに戻ります。そうでなければfalseに戻ります。 size():キューに戻る要素の個数は、配列のlength属性と類似している。 toString():キューの内容を文字列形式に変換する。 二、パッケージクラス
2.1.コード実現
2.2.キューの適用
行列を使ってゲームを実現します。太鼓をたたいて花を伝えて、データと設定の数字numに入ってきて、配列内の要素を巡回して、遍歴した元素が指定の数字numの時にこの元素を削除して、配列が一つの要素が残ります。
コードの実装:
三、優先列
優先順位のキューが主に考慮される問題は以下の通りです。
各要素はもう一つのデータではなく、データの優先度も含んでいます。データを追加する過程で、優先度によって正しい位置に入れます。3.1優先順位行列の実現
コードの実装:
3.2.注意点
配列方法のspliceの使い方について:
splice(1,0,'Tom'):インデックスが1の要素の前に要素'Tom'(インデックスが1の要素から削除し、0の要素を削除し、インデックスが1の要素の前に要素'Tom'を追加するという意味もあります。
splice(1,1,'Tom'):インデックスが1の要素から削除(インデックスが1の要素を含む)し、要素を1つ削除し、要素'Tom'を追加します。索引の1の要素を要素'Tom'に置き換えます。
配列のpush方法は、配列、スタック、およびキューの形態である:配列:配列[0,1,2]において、ポップ(3)、結果は[0,1,2,3]である。 スタック:pop(0)、pop(1)、pop(2)、pop(3)を実行し、スタック底からスタックトップまでの要素はそれぞれ:0、1、2、3;配列として参照すれば、[0,1,2,3]と書くことができますが、インデックスが3の要素3は実はスタックトップ要素です。したがって、スタックのpush方法は、スタックの一番上に要素を追加することである(ただし、配列の視点では配列の最後に要素を追加することである)。 列:enqueue方法は、配列のpush方法によって実現されてもよく、配列の最後に要素を追加するのと同じである。 スタック構造は、下向き(インデックス値が下から上へ増加する)の配列構造であると考えられています。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。
キューは制限された線形表であり、先入れ先出し(FIFO:first in first out)が特徴である。
制限されているのは、表の先端のみで削除操作が許可されていることです。表のバックエンドに挿入操作を行います。
列に並んで切符を買うのと同じです。先に来たのは先に切符を買います。後から切符を買います。
キューのアプリケーション:
印刷キュー:複数のファイルをコンピュータで印刷する場合は、整列印刷が必要です。スレッドキュー:マルチスレッドを開くと、新しいスレッドが必要なリソースが足りない場合は、先にスレッドキューに入れて、CPU処理を待つ。
キュークラスの実装:
キューの実装はスタックと同じで、2つの案があります。
配列に基づいて実現する。チェーンに基づいて実現する;
キューの一般的な操作:
2.1.コード実現
//
function Queue() {
//
this.items = []
//
// 1.enqueue():
Queue.prototype.enqueue = element => {
this.items.push(element)
}
// 2.dequeue():
Queue.prototype.dequeue = () => {
return this.items.shift()
}
// 3.front():
Queue.prototype.front = () => {
return this.items[0]
}
// 4.isEmpty:
Queue.prototype.isEmpty = () => {
return this.items.length == 0;
}
// 5.size():
Queue.prototype.size = () => {
return this.items.length
}
// 6.toString():
Queue.prototype.toString = () => {
let resultString = ''
for (let i of this.items){
resultString += i + ' '
}
return resultString
}
}
テストコード:
//
let queue = new Queue()
//
queue.enqueue('a')
queue.enqueue('b')
queue.enqueue('c')
queue.enqueue('d')
console.log(queue); //58
//
queue.dequeue()
console.log(queue); //62
queue.dequeue()
console.log(queue); //64
//front
console.log(queue.front()); //67
//
console.log(queue.isEmpty()); //70
console.log(queue.size()); //71
console.log(queue.toString()); //72
テスト結果:2.2.キューの適用
行列を使ってゲームを実現します。太鼓をたたいて花を伝えて、データと設定の数字numに入ってきて、配列内の要素を巡回して、遍歴した元素が指定の数字numの時にこの元素を削除して、配列が一つの要素が残ります。
コードの実装:
// : :
let passGame = (nameList, num) => {
//1.
let queue = new Queue()
//2.
// ES6 for ,i nameList[i]
for(let i of nameList){
queue.enqueue(i)
}
// 3.
while(queue.size() > 1){// 1
// num ,
// num ,
// 3.1.num ( )
for(let i = 0; i< num-1; i++ ){
queue.enqueue(queue.dequeue())
}
// 3.2.num ,
/*
, , , num num-1 , num , dequeue
*/
queue.dequeue()
}
//4.
console.log(queue.size()); //104
let endName = queue.front()
console.log(' :' + endName); //106
return nameList.indexOf(endName);
}
//5.
let names = ['lily', 'lucy', 'Tom', 'Lilei', 'Tony']
console.log(passGame(names, 3)); //113
テスト結果:三、優先列
優先順位のキューが主に考慮される問題は以下の通りです。
各要素はもう一つのデータではなく、データの優先度も含んでいます。データを追加する過程で、優先度によって正しい位置に入れます。3.1優先順位行列の実現
コードの実装:
//
function PriorityQueue() {
// : ;
function QueueElement(element, priority) {
this.element = element;
this.priority = priority;
}
//
this.items = []
// 1.
PriorityQueue.prototype.enqueue = (element, priority) => {
// 1.1. QueueElement
let queueElement = new QueueElement(element, priority)
// 1.2.
if(this.items.length == 0){
this.items.push(queueElement)
}else{
//
let added = false
for(let i of this.items){
// (priority , )
if(queueElement.priority < i.priority){
this.items.splice(i, 0, queueElement)
added = true
// break
break
}
}
// ,
if(!added){
this.items.push(queueElement)
}
}
}
// 2.dequeue():
PriorityQueue.prototype.dequeue = () => {
return this.items.shift()
}
// 3.front():
PriorityQueue.prototype.front = () => {
return this.items[0]
}
// 4.isEmpty():
PriorityQueue.prototype.isEmpty = () => {
return this.items.length == 0;
}
// 5.size():
PriorityQueue.prototype.size = () => {
return this.items.length
}
// 6.toString():
PriorityQueue.prototype.toString = () => {
let resultString = ''
for (let i of this.items){
resultString += i.element + '-' + i.priority + ' '
}
return resultString
}
}
テストコード:
//
let pq = new PriorityQueue();
pq.enqueue('Tom',111);
pq.enqueue('Hellen',200);
pq.enqueue('Mary',30);
pq.enqueue('Gogo',27);
//
console.log(pq);
テスト結果:3.2.注意点
配列方法のspliceの使い方について:
splice(1,0,'Tom'):インデックスが1の要素の前に要素'Tom'(インデックスが1の要素から削除し、0の要素を削除し、インデックスが1の要素の前に要素'Tom'を追加するという意味もあります。
splice(1,1,'Tom'):インデックスが1の要素から削除(インデックスが1の要素を含む)し、要素を1つ削除し、要素'Tom'を追加します。索引の1の要素を要素'Tom'に置き換えます。
配列のpush方法は、配列、スタック、およびキューの形態である:
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。