0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【TypeScriptで学ぶデータ構造】スタック

Last updated at Posted at 2024-09-11

スタック

最後に入れたデータを最初に取り出していくデータ構造の一種
後入れ先出し(Last In, First Out)

イメージは一つづつ積み上げていった積み木を上から取っていく感じです。

具体的な例としては、ブラウザの「戻る」機能

ブラウザトップページ→Qiitaの記事1→おすすめから飛んだQiitaの記事2

と移動した場合、上記がスタック内に積まれ、おすすめから飛んだQiitaの記事2にいる状態で「戻る」矢印を押下するとおすすめから飛んだQiitaの記事2が取り出され(削除され)Qiitaの記事1が表示される。

また、テキストエディターの「戻る」(command or ctr + z)も後入れ先出しなので操作履歴はスタックの構造ですね!

スタックを再現したstackクラス

addメソッドでitems配列にデータを格納します。
そして、removeメソッドを実行するたびに後から入れたデータが削除されます(取り出されます)

以下のコードを実行すると

1000を格納→5000を格納→10000を格納→10000を取り出す→5000を取り出すという処理が行われます。(ブラウザの例と同じ)

stack.ts
class Stack<T> {
	private items: T[] = [];
	private top: number = -1; //スタックのトップを管理

	//要素をスタックに追加するメソッド(標準のpushメソッドを使うともう少しシンプルになる)
	add(item: T): void {
		this.top += 1;
		this.items[this.top] = item;
	}

	//スタックの一番上の要素を削除して返すメソッド(標準のpopメソッドを使うともう少しシンプルになる)
	remove(): T | undefined {
		if (this.isEmpty()) {
			return undefined;
		}
		const poppedItem = this.items[this.top];
		this.items.splice(this.top, 1);
		this.top -= 1;
		return poppedItem;
	}

	//スタックが空かどうかを確認するメソッド
	isEmpty(): boolean {
		return this.top === -1;
	}

	//スタックの内容を表示(表示用です)
	printStack(): void {
		console.log(this.items.join(" "));
	}
}

// 使用例です
const stack = new Stack<number>();
// スタックに1000を格納
stack.add(1000);
stack.add(5000);
stack.add(10000);

//この時点では1000 5000 10000
stack.printStack();

//取り出す処理。下記の場合、10000が取り出され、↓
stack.remove();
//次に以下で5000が取り出される
stack.remove();
//残ったのは最初に入れた1000
stack.printStack();

JavaScript標準のメソッド

pushメソッド

配列の末尾に指定された要素を追加するメソッド

popメソッド

配列から最後の要素を取り除き、その要素を返すメソッド

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?