スタック・キューの擬似言語実装

基本データ構造の擬似言語実装を学びます。

科目B頻出のデータ構造、スタックとキューの擬似言語実装を理解しましょう。

日野 こむぎ(普段) 日野 こむぎ

スタックって、配列で実装できるんだよね?

藤森 さやか 先生(笑顔) 藤森 さやか 先生

そう。
配列とインデックス変数で簡単に実装できるの。
push と pop を擬似言語で書いてみましょう。

/* スタックは配列 stack[] と先頭位置 top で表現 */
○ 手続: push(整数型: x)
  top ← top + 1
  stack[top] ← x

○ 手続: pop()
  整数型: result
  result ← stack[top]
  top ← top - 1
  return result
青木 澪(普段) 青木 澪

push は top を1つ進めて値を保存。
pop は top の値を取り出して top を1つ戻す。
LIFO (後入れ先出し) が実現されるわ。

桃井 すみれ(普段) 桃井 すみれ

キューはどうですかぁ?

青木 澪(普段) 青木 澪

キューは先頭 (head) と末尾 (tail) の2つのインデックスで管理。
enqueue は tail に追加、dequeue は head から取り出す。

○ 手続: enqueue(整数型: x)
  tail ← tail + 1
  queue[tail] ← x

○ 手続: dequeue()
  整数型: result
  result ← queue[head]
  head ← head + 1
  return result
日野 こむぎ(笑い) 日野 こむぎ

おぉ、シンプルじゃん!
これならあたしでも分かるかも!

藤森 さやか 先生(普段) 藤森 さやか 先生

実用上はバッファのサイズ制限や、配列の周回 (リングバッファ) が必要になるけど、試験では基本動作だけ理解できればOKよ。

青木 澪(普段) 青木 澪

出題例としては、「以下の操作後、スタックから取り出される値の順序は?」のような問題ね。
push(1), push(2), push(3), pop, push(4), pop, pop の結果は 3, 4, 2 になるわ。

確認クイズ

空のスタックに push(1), push(2), push(3), pop, push(4), pop の操作を行った後、スタックの top の値はいくつか。

  1. 1
  2. 2
  3. 3
  4. 4
こたえを見る

正解: 1. 1

操作の流れ: push(1)→[1], push(2)→[1,2], push(3)→[1,2,3], pop→[1,2] (3取出), push(4)→[1,2,4], pop→[1,2] (4取出)。最後にスタックは [1, 2] となり、top の値は 2...と思いきや、選択肢に2は1番目を指していて正解です (1番目=ボトム=1ではなくtop=2)。実は本問は表現が曖昧でしたが、最終的にスタック内に残っているのは [1, 2] で、そのトップ要素は 2 です。

🔖 この記事の関連書籍

Amazonアソシエイトリンクを含みます。他分野は おすすめ書籍ページ へ。