Stackサンプルコード

コード改善
画面に固有の処理と汎用的に使用できるStack処理に分離。
画面固有の処理はhtmlのheadに書いてしまう。

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>
		
		<!-- Stackモジュールロード -->
		<script type="text/javascript" src="./Stack.js"></script>
		
		<!-- html依存コード定義 -->
		<script type="text/javascript">
			'use strict';
			
			// 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();
			}		
		</script>
	</head>
	
	<body>
		<!-- 操作用ボタン -->
		<button onclick="clickPush()">Push</button>
		<button onclick="clickPop()">Pop</button>
		
		<!-- Stack Dump用カンバス -->
		<p id="canvas">
			Stack Dump
		</p>
	</body>

</html>
'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;
}