Web/DB プログラミング徹底解説

ホーム > JavaScript プログラミング > JavaScript による一番簡単なスタックとキューの実装方法

JavaScript による一番簡単なスタックとキューの実装方法

JavaScript の Array オブジェクトには配列の先頭要素の取り出し (shift)、最後尾要素への追加 (push)、 最後尾要素の取り出し (pop) 等の操作が実装されています。

Array の持つメソッドだけを使って、スタック及びキューを実装してみましょう。

スタックの実装

スタックは LIFO (Last In First Out) のデータ構造です。つまり、1,2,3 の順番で、 スタックにデータをプッシュすると、取り出すデータは3,2,1 の順番で出てきます。

慣例的に、スタックにデータを入れる操作を push, データを取り出す操作を pop といいます。 JavaScript の Array オブジェクトには既に push, pop が実装されていますから、それをそのまま使いましょう。

クラスの定義方法に不慣れな人は、当サイトの JavaScript によるオブジェクト指向プログラミング を見てください。


//
// Stack (LIFO)
//

function Stack() {
	this.__a = new Array();
}

Stack.prototype.push = function(o) {
	this.__a.push(o);
}

Stack.prototype.pop = function() {
	if( this.__a.length > 0 ) {
		return this.__a.pop();
	}
	return null;
}

Stack.prototype.size = function() {
	return this.__a.length;
}

Stack.prototype.toString = function() {
	return '[' + this.__a.join(',') + ']';
}

定義は以上です。内部変数として Array オブジェクトを持ちます。 push, pop メソッドはデータの出し入れ、size メソッドは現在のデータ数、 そして toString メソッドはデータ構造中のデータを JSON 形式でダンプします。

テストコードは次のようになります。


//
// Stack の動作確認
//

var i;
var s = new Stack();
s.push(1);
s.push(2);
s.push(3);
alert( s.toString() );

while( i = s.pop() ) {
	alert( i );
}

キューの実装

キューは FIFO のデータ構造です。ところてん方式に、先に入れたのが取り出せます。 1,2,3 の順番でデータを格納すれば、取り出すのも1,2,3 の順番です。

慣例的にキューにデータを入れる操作を、push とか enqueue、データを取り出す操作を get とか dequeue といいます。Array オブジェクトのメソッドで言えば、前者は push、 後者は shift メソッドに対応します。


//
// Queue (FIFO)
//

function Queue() {
	this.__a = new Array();
}

Queue.prototype.enqueue = function(o) {
	this.__a.push(o);
}

Queue.prototype.dequeue = function() {
	if( this.__a.length > 0 ) {
		return this.__a.shift();
	}
	return null;
}

Queue.prototype.size = function() {
	return this.__a.length;
} 

Queue.prototype.toString = function() {
	return '[' + this.__a.join(',') + ']';
}

以上が定義です。テストコードは以下の通りです。


//
// Queue の動作確認
//

var i;
var q = new Queue();
q.enqueue(1);
q.enqueue(2);
q.enqueue(3);
alert( q.toString() );

while( i = q.dequeue() ) {
	alert( i );
}