1. test 1
  2. test 2
  3. test 3
  4. test 4
  5. test 5
  6. test 6
  7. test 7
コース一覧
アルゴリズム道場 カメ師範の十の巻
第七の巻 スタックを作れ

アルゴリズム道場 カメ師範の十の巻

言語を問わず、考え方だけを問う演習専用コースです。解説はありません。巻物と完成条件だけを読み、白紙から自分で組み立てます。Python・JavaScript・TypeScript・Java のどれで解いても構いません。手が止まったときのために、方針・使う構文・部分解の3段階のヒントを各問に用意しています。総和と最大から始まり、線形探索、整列、二分探索、再帰、スタックとキューを経て、最後は初見の疑似コードを読み解いて実装するところまで、10問でアルゴリズムの基礎を一巡します。1問15分から45分、全10問で約5時間です。いずれかの言語の入門を終えて「動くものは書けるが、考え方に自信がない」と感じている方に向いています。

1
初段
01. 第一の巻 総和と最大15分
02. 第二の巻 線形探索15分
03. 第三の巻 バブルソート20分
04. 第四の巻 二分探索25分
2
中段
01. 第五の巻 整列の途中経過25分
02. 第六の巻 再帰25分
03. 第七の巻 スタックを作れ30分
04. 第八の巻 キューを作れ30分
3
師範
01. 第九の巻 計算量を体感せよ35分
02. 免許皆伝 初見の巻物45分

第七の巻 スタックを作れ

中段 / 目安 30分

カメ師範が、洗い場に積まれた皿を指さしました。

「見よ。洗った皿を上へ上へと積んでおる。次に使うのはどれじゃ。一番下ではあるまい。一番上、つまり最後に置いた皿じゃ」

七本目の巻物には、こう書かれています。「皿を積むように、後から入れた物が先に出る器を、配列で作れ。push、pop、そして覗き見(peek)」

この器はスタックと呼ばれます。ブラウザの「戻る」も、関数を呼んだあとに元の場所へ帰れるのも、中身はこの皿の積み方です。今回は既製の器を使わず、配列だけで自分で作ります。

覚える操作は3つです。push は皿を一枚上に積む。pop は一番上の皿を取り出して器から減らす。peek は一番上を見るだけで、器は減らさない。この「減らす」と「減らさない」の違いが、この巻の要です。

もう一つ決めておくことがあります。空の器に pop や peek が来たらどうするかです。落ちて止まる器は使い物になりません。今回は empty という札を返す約束にします。

完成条件

runStack という関数を1つ定義してください。どの言語で解いても関数名は runStack にしてください。Python でも snake_case ではなく、この綴りのまま使います。

引数は1つ、操作を並べたカンマ区切りの文字列です。たとえば次の形です。

プレーンテキスト

push 3,push 5,pop,peek

操作は3種類です。

  • push 数 — その数を器の一番上に積みます
  • pop — 一番上を取り出して器から減らします。空なら何も減らさず empty を記録します
  • peek — 一番上を見るだけで器は減らしません。空なら empty を記録します

pop と peek は、見た値を出た順に記録していきます。push は何も記録しません。

全部の操作を終えたら、次の形の1つの文字列を返してください。

プレーンテキスト

stack=3 out=5,3

stack= の後ろは器に残った中身を下から上の順にスラッシュでつないだもの、out= の後ろは記録した値をカンマでつないだものです。どちらも空のときは - の一文字にします。上の例は push 3,push 5,pop,peek を処理した結果で、器には3だけが残り、pop で5、peek で3を見たという意味です。

引数の文字列の前後には余分な空白が入ることがあります。1つずつ切り出したあとに整えてください。

進め方

白紙から書いてください。手が止まったらヒントを開けます。ヒントは3段階で、①方針、②使う構文、③部分解の順に出ます。1つも開けずに通せたら、その問題は自分のものです。

開かずに10分粘って進まないなら、①だけ開けてください。粘る時間そのものには価値がありません。価値があるのは、自分で書いた行が動いた瞬間です。

配列のどちら側を「皿の一番上」と決めるかで、書きやすさが大きく変わります。末尾を上と決めると、積むのも取り出すのも末尾だけを触れば済みます。先頭を上と決めると、積むたびに全部をずらすことになります。同じスタックでも、置き方一つで手間が変わることを確かめてください。

要件

  1. 関数名は4言語すべてで runStack にすること(Python も snake_case にしない)
  2. 引数はカンマ区切りの操作文字列1つ
  3. 既製のスタック型を使わず、配列だけで組み立てること
  4. push は数を一番上に積み、何も記録しないこと
  5. pop は一番上を取り出して器から減らし、その値を記録すること
  6. peek は一番上を見るだけで器を減らさず、その値を記録すること
  7. pop と peek が空の器に来たら、器を変えず empty を記録すること
  8. 戻り値は「stack=残った中身 out=記録」の形の文字列で、残りは下から上へスラッシュ区切り、記録はカンマ区切り
  9. 残りも記録も、空のときは半角ハイフン1文字にすること
  10. 切り出した操作の前後の余分な空白を取り除くこと

入出力例

runStack("push 3,push 5,pop,peek") → "stack=3 out=5,3" runStack("push 1,push 2,push 3") → "stack=1/2/3 out=-" runStack("pop,peek,push 9,peek") → "stack=9 out=empty,empty,9" runStack("push 10,pop,pop") → "stack=- out=10,empty" runStack("push 4,push 7,peek,pop,pop,peek") → "stack=- out=7,7,4,empty" runStack("push 42") → "stack=42 out=-" runStack("push 8, push 6 , pop , push 2") → "stack=8/2 out=6"

ヒント

前のヒントを開くと次が開きます。開かずに解けると未開封クリアです

①方針 空の配列を器、空の配列を記録として用意し、操作を1つずつ見ていくだけの形です。まず操作の文字列を区切って1つずつ取り出す部分だけを書き、正しく分かれることを確かめてから、3種類の処理を足していきます

ヒント 2ヒント 1 を開くと読めます
ヒント 3ヒント 2 を開くと読めます
生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/08/09

関連レッスン

  • 第八の巻 キューを作れ

    先に並んだ者が先に出る器を作ります。スタックとの違いを言葉にします。

  • 第九の巻 計算量を体感せよ

    同じ答えを出す2つのやり方で、比べた回数がどれだけ違うかを数えます。

  • 第六の巻 再帰

    自分を呼ぶ関数を書きます。止まる条件を先に決めるのが要です。

  • 第五の巻 整列の途中経過

    選択ソートが3周を終えた時点の並びを答えます。1周で何が確定するかを追います。

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

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

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

メモ

第七の巻 スタックを作れ

⌘S で保存