1. [1] + push 5, push 3, pop, push 9 -> [1,5,9]
  2. initial [1,2] + push 3, pop, pop -> [1]
  3. all pop on partial stack -> stays []
  4. no operations -> initial unchanged
  5. push, push, push -> [1,2,3]
  6. pop all then push -> [42]
コース一覧
コンピューターサイエンス入門:理論編
スタック (push/pop) を実装する

コンピューターサイエンス入門:理論編

2 進数、論理演算、ビット演算、データ構造、計算量、メモリモデルなど、プログラミングの土台となるコンピュータサイエンスの理論知識を学べるコースです。プログラミングを始めたばかりの学習者や、CS の体系的な土台を作りたい現役エンジニアを対象としています。約 13 時間 (1 日 30 分 × 26 日) で 53 レッスンを修了でき、修了後はコードのパフォーマンスや設計判断の根拠を理解した上で実装できるようになります。

1
2進数とビット演算
01. 2進数から10進数への変換5分
02. 10進数から2進数への変換5分
03. ビットAND演算でフラグ判定5分
04. OR / XOR でフラグを操作する5分
05. popcount で 1 のビット数を数える5分
06. シフト演算で 2 倍 / 半分5分
07. 16 進数から 10 進数への変換5分
08. 第 1 章まとめクイズ5分
2
文字コードと真偽値ロジック
01. 文字 → ASCII コード5分
02. コード → 文字5分
03. UTF-8 のバイト長を返す5分
04. AND / OR の真理値表5分
05. NOT / XOR の真理値表5分
06. 含意 (→) を AND/OR/NOT で表現5分
07. ド・モルガンの法則5分
08. 第2章まとめクイズ5分
3
計算量とBig-O
01. forループの実行回数を返す5分
02. 入れ子ループの実行回数5分
03. 線形探索 (O(n))5分
04. 二分探索 (O(log n))5分
05. バブルソート5分
06. 配列の最大と最小5分
07. 累積和で範囲合計5分
08. 第3章まとめクイズ5分
4
データ構造 (基本)
01. スタック (push/pop) を実装する5分
02. キュー (enqueue / dequeue) を実装する5分
03. カッコのバランス判定 (スタック応用)5分
04. set で重複を除去する5分
05. map で出現回数を数える5分
06. 二数の和 (map で O(n))5分
07. アナグラム判定5分
08. 第 4 章クイズ — データ構造 (基本)5分
5
ファイル / メモリ / IO 概念
01. バイト → KB 変換5分
02. ディスクサイズフォーマット5分
03. キャッシュヒット率5分
04. LRU 簡易シミュレーション5分
05. エンディアンの入れ替え (uint32)5分
06. バッファ範囲チェック5分
07. 第5章まとめクイズ5分
6
ネットワークと符号化
01. Base64 エンコード後の長さ計算5分
02. URL エンコード対象文字数5分
03. IPv4 アドレスを 32bit 整数に変換5分
04. 32bit 整数を IPv4 アドレスに変換5分
05. CIDR プレフィックスからネットマスクを作る5分
06. 単純チェックサム5分
07. 第6章まとめクイズ5分
7
設計と DB 基礎
01. 重複データを 1NF に変換 (フラットなリスト化)5分
02. キーで join (map 利用)5分
03. 残高転送のトランザクション風処理5分
04. CAP の availability 模擬5分
05. URL ルーティング5分
06. 疎結合と密結合 — 依存性注入で設計を変える12分
07. コース総まとめクイズ5分

スタック (push/pop) を実装する

スタックとキュー

取り消しは、必ず直前の操作から

エディタで文字を打ち、色を変え、画像を貼った。ここで取り消しを押したら、消えるのは画像です。もう一度押せば色、その次が文字。最後にやったことから順に戻る のであって、最初にやったことから戻ることはありません。ブラウザの戻るボタンも、関数の呼び出し履歴も、全部この順番です。

この「最後に入れたものが最初に出てくる」並べ方を スタック と呼びます。皿を積み上げて、上から取っていく形と同じです。

末尾を「上」にすると、積むのも取るのも一瞬

配列の 末尾 をスタックの上と決めてしまえば、積む操作も取る操作も、末尾だけを触れば済みます。

Python

history = [] history.append("太字にした") history.append("画像を貼った") print(history[-1]) # 画像を貼った 次に取り消されるのはこれ history.pop() print(history) # ['太字にした']

append で末尾に積み、pop で末尾を外します。JavaScript の配列も push と pop で同じことができます。どちらも他の要素には一切触らないので、中身が何件あっても一定の時間で終わります。

先頭を「上」にすると、急に遅くなる

同じことを配列の 先頭 でやると、話が変わります。先頭に 1 つ入れるには、既に入っている全部を 1 つずつ後ろへずらす必要があります。取り出すときも同じで、残り全部を 1 つ前へ詰め直します。

Python

history = list(range(100000)) history.insert(0, "新しい操作") # 10 万個をずらす

積む、取り出すという同じ意味の操作なのに、末尾なら O(1)、先頭なら O(n) です。どちらを上と決めるかだけで、性能が丸ごと変わります。迷ったら末尾にしてください。

何も積んでいないのに、取り出そうとする

取り消しを押し続けると、いつか戻るものが無くなります。そのときにどうするかを決めていないと、素直に落ちます。

Python

history = [] history.pop() # IndexError: pop from empty list

JavaScript の pop は落ちずに undefined を返しますが、そのまま次の処理へ流れていくぶん、原因の分かりにくいバグになりがちです。空かどうかを先に確かめて、空なら何もしない、と決めておくのが安全です。

もう 1 つ。渡された配列をそのまま積み下ろしすると、呼び出した側の配列まで書き換わります。手元で作業したいなら、最初にコピーを取ってください。

要件

  1. operations の各要素は ['push', N] (N は整数) か ['pop'] のいずれか
  2. 空スタックに対する pop は何もせず無視する
  3. 戻り値は最終的なスタック状態を表す整数配列 (底 → top の順)

入出力例

stackOps([1], [["push",5],["push",3],["pop"],["push",9]]) → [1,5,9] stackOps([1,2], [["push",3],["pop"],["pop"]]) → [1] stackOps([1,2], [["pop"],["pop"],["pop"],["pop"]]) → [] stackOps([7,8,9], []) → [7,8,9] stackOps([0], [["push",1],["push",2],["push",3]]) → [0,1,2,3] stackOps([10,20], [["pop"],["pop"],["pop"],["push",42]]) → [42]

ヒント

配列の末尾を top とみなすと、push は append (末尾追加)、pop は末尾削除でそのまま実装できる

操作配列の op[0] が 'push' / 'pop' を表す。'push' のときは op[1] が値

initial を直接書き換えないように、最初にコピーを作ってから操作する

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/19·更新 2026/08/26

関連レッスン

  • キュー (enqueue / dequeue) を実装する

    先入れ先出し (FIFO) のキューを enqueue / dequeue の操作シーケンスで動かし、最終状態を配列で返す。

  • カッコのバランス判定 (スタック応用)

    スタックを使い、`(){}` `[]` 混在の文字列が正しいネスト構造になっているか判定する。

  • set で重複を除去する

    set を使って、整数配列から重複を取り除き、昇順ソート済みの配列を返す。

  • map で出現回数を数える

    ハッシュマップ (dict / Map) を使って、整数配列の各値の出現回数を 1 パスで集計する。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • ブラウザユーザーから見たWebのクライアント
  • 関数処理に名前を付けて再利用できる単位
  • スタック後入れ先出し(LIFO)のデータ構造
  • 配列サイズ固定の同型データの集まり
  • JavaScriptWeb で動的な振る舞いを担う言語
  • 処理計算や代入を表す長方形
  • branchGit で開発するときに毎日打つ 5 つの基本コマンド
  • pushローカルの変更をリモートへ送る操作
main.py
学習モード
エディタを読み込んでいます

メモ

スタック (push/pop) を実装する

⌘S で保存