Stackサンプルコード

リンクリストを利用したStackデータ構造操作のサンプルコード

stack.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<title>Stack Sample</title>
		<script type="text/javascript" src="./Stack.js"></script>
	</head>
	
	<body>
		<button onclick="clickPush()">Push</button>
		<button onclick="clickPop()">Pop</button>
		<p id="canvas">
			Stack Dump
		</p>
	</body>

</html>

Stack.js

'use strict';

// Stack サンプルコード
// 汎用的なコードなので、名前空間を考慮したほうが良いが
// それは後の課題とする。

// ノードコンストラクタ
function Node(value) {
	this.value = value;
	this.next = null;			// ひとまずnullを設定しておく
}

var stack = new Node(0);		// スタックを保持するダミーノード

// 引数の値をpushする。
function push(value) {
	var node = new Node(value);
	
	// スタックに積む
	node.next = stack.next;
	stack.next = node;
}

// stackからpopした値を返す。
function pop(value) {
	var node = stack.next;
	var rtn;
	
	if (node) {
		// 先頭要素をスタックから切り離す。
		stack.next = node.next;
		rtn = node.value;
	} else {
		// ノード無しのばあい、'no value'を返す。
		rtn = 'no value!';
	}
	
	return rtn;
}

// stackをdumpした文字列を返す
function dump() {
	var rtn = '';
	var node;
	
	for (node = stack.next; node; node = node.next) {
		rtn += node.value + '<br />';
	}
	
	return rtn;
}

// Pushボタンクリック処理処理
// promptでユーザから文字列を受け取り、stackにプッシュ
// canvasにスタック状態を更新表示
function clickPush() {
	var value = prompt('スタックにPushする文字列入力', '');
	var canvas = document.getElementById('canvas');
	
	if (value) {	// 入力があった場合
		push(value);
		canvas.innerHTML = dump();
	}
}

// Popボタンクリック処理処理
// stackからpopした値をalert表示
// canvasにスタック状態を更新表示
function clickPop() {
	var value = pop();
	var canvas = document.getElementById('canvas');
	
	alert(value);
	
	canvas.innerHTML = dump();
}

ToDoList

  • グローバル名前空間に無造作にメソッド、変数を置いているので、名前空間を利用したものにしたい。
  • タックインスタンスがモジュールに1つで固定されている。汎用的なモジュールを目指し、マルチインスタンス化したい。
  • clickPush, clickPopは画面に特化したメソッドなので、Stackモジュールからは追い出してしまいたい。→逆に言えば、clickPush, clickPopは汎用的にしても余り意味が無い。