資格試験

【基本情報】キュー・スタックの違いって何?
それぞれの使い方と演習問題

今回は、キューとスタックについてそれぞれの使い方と、それに対する演習問題までご紹介していこうと思います。

インプットもアウトプットも同時に試せてしまうため、本記事を通して『キュー・スタック』に関する知識を確かなものにしてしまいましょう。

また、本記事で扱っている演習問題は、大半が基本情報技術者試験の過去問になるため、試験対策にもなります。
ぜひ最後まで見ていってください。

この記事でわかること

  • キューについて
  • スタックについて
  • キュー・スタックに関する演習問題

 用語解説

では、まず初めにキューやスタックについてその意味や違いを解説していこうと思います。

キューとは?

キューとは、先に格納したデータから順番に取り出す、先入先出型のデータ構造のことです。

下の図では、データが追加された順に左から並んでおり、取り出しの際には、一番左のデータが取り出されています。

このように、一番古いデータから取り出すようなデータ構造をキューというので、よく覚えておきましょう。

編集者

ちなみに、queueは英語で『列』という意味があります。

遊園地で出来る行列でも、一番初めに並んでいた人から順に抜けていきますよね。

それをイメージしてもらえれば、少し覚えやすいと思います!

enqueue(エンキュー)・dequeue(デキュー)とは?

キューにデータを追加することをenqueue(エンキュー)、キューからデータを取り出すことをdequeue(デキュー)と言います。

enqueueやdequeueのルールに関する問題はよく出題されるので、言葉まで覚えておきましょう。

スタックとは?

スタックとは、後に格納したデータから順番に取り出す、後入先出型のデータ構造のことです。

下の図のように、箱にデータを詰めていく様子をイメージすると、わかりやすいと思います。

箱にデータを詰めていくと、一番最後に入れたデータから取り出すことになりますよね。

push(プッシュ)・pop(ポップ)とは?

スタックにデータを追加することをpush(プッシュ)、スタックからデータを取り出すことをpop(ポップ)と言います。

こちらも、試験でよく問われるため覚えておきましょう。

 演習問題

続いては演習問題です。
インプットした知識を演習を通じてアウトプットして、知識の定着を図りましょう。

演習問題①

キューに関する記述として,最も適切なものはどれか。
[基本情報技術者平成27年春期 午前問5]

ア. 最後に格納されたデータが最初に取り出される。

イ. 最初に格納されたデータが最初に取り出される。

ウ. 添字を用いて特定のデータを参照する。

エ. 二つ以上のポインタを用いてデータの階層関係を表現する。

解答・解説を見る

解答:イ

  • ア:スタックに関する記述です。
  • イ:正しい。
  • ウ:配列に関する記述です。
  • エ:リスト構造に関する記述です。
  • 演習問題②

    PUSH命令でスタックにデータを入れ,POP命令でスタックからデータを取り出す。動作中のプログラムにおいて,ある状態から次の順で10個の命令を実行したとき,スタックの中のデータは図のようになった。1番目のPUSH命令でスタックに入れたデータはどれか。

    [基本情報技術者平成17年春期 午前問13]

    ア. 7

    イ. 29

    ウ. 55

    エ. 326

    解答・解説を見る

    解答:ア

    問題文の命令を見ると、PUSH命令が7回、POP命令が3回行われていることがわかります。
    このことから、上記の10個の命令を行うと最終的に4つのデータが追加されることがわかるので、29は命令を実行する前から入っていたことになります。
    よって、初めのPUSH命令で追加されたデータは、29の上の7です。

    演習問題③

    A,C,K,S,Tの順に文字が入力される。スタックを利用して,S,T,A,C,Kという順に文字を出力するために,最小限必要となるスタックは何個か。ここで,どのスタックにおいてもポップ操作が実行されたときには必ず文字を出力する。また,スタック間の文字の移動は行わない。
    [基本情報技術者令和元年秋期 午前問8]

    ア. 1

    イ. 2

    ウ. 3

    エ. 4

    解答・解説を見る

    解答:ウ
    []の中の文字をスタックの中身として、解説を進めます。

    〇スタック1つ使用の場合
    push A → [A]   
    push C → [A, C] //AよりもCの方が先にpopされてしまうため×

    〇スタック2つ使用の場合
    push A → [A][] 
    push C → [A][C] 
    push K → [A, K] or [A, C] //AよりもKもしくはCの方が先にpopされてしまうため×

    〇スタック3つ使用の場合
    push A → [A][][]  
    push C → [A][C][] 
    push K → [A][C][K] 
    push S → [A][C][K, S] 
    pop → [A][C][K] , Sを出力 
    push T → [A][C][K, T] 
    pop → [A][C][K] , Tを出力 
    pop → [][C][K] , Aを出力 
    pop → [][][K] , Cを出力
    pop →[][][] , Kを出力

    よって、最低でもスタックは3つ必要ということになります。
    実際にノートに書いて確かめてみましょう。

    演習問題④

    四つのデータA,B,C,Dがこの順に入っているキューと空のスタックがある。手続pop_enq,deq_pushを使ってキューの中のデータをD,C,B,Aの順に並べ替えるとき,deq_pushの実行回数は最小で何回か。ここで,pop_enqはスタックから取り出したデータをキューに入れる操作であり,deq_pushはキューから取り出したデータをスタックに入れる操作である。
    [基本情報技術者平成24年秋期 午前問5]

    ア. 2

    イ. 3

    ウ. 4

    エ. 5

    解答・解説を見る

    解答:イ
    deq_push → deq_push → deq_push → pop_enq → pop_enq → pop_enq 
    によって、問題の指示通りにデータを並べ替えることが出来ます。
    先ほどの問題同様、図を書いて考えてみてみましょう。

    演習問題⑤

    空の状態のキューとスタックの二つのデータ構造がある。次の手続を順に実行した場合,変数xに代入されるデータはどれか。ここで,手続きに引用している関数は,次のとおりとする。

    〔関数の定義〕

    • push(y):データyをスタックに積む。
    • pop():データをスタックから取り出して,その値を返す。
    • enq(y):データyをキューに挿入する。
    • deq():データをキューから取り出して,その値を返す。

    〔手続〕

    • push(a)
    • push(b)
    • enq(pop())
    • enq(c)
    • push(d)
    • push(deq())
    • x ← pop()
    [基本情報技術者平成26年春期 午前問7]

    ア. a

    イ. b

    ウ. c

    エ. d

    解答・解説を見る

    解答:イ
    []の中の文字をスタックの中身、()の中の文字をキューの中身として、解説を進めます。

    push(a) //[a] , ()
    push(b) //[a, b] , ()
    enq(pop()) //[a] , (b)
    enq(c) //[a] , (b, c)
    push(d) //[a, c] , (b, c)
    push(deq()) //[a, c, b] , (c)
    x ← pop() //x ← b

    よって、xに代入されるデータはbとなります。

     まとめ

    今回は、キューとスタックについての説明や、それらに関する演習問題を紹介してきたのですが、いかがだったでしょうか。

    • キューは先入先出型
    • スタックは後入先出型

    です。

    キューとスタックは、データを扱うデータ構造としてよく試験で問われますが、違いを明確に理解しておきましょう。

    -資格試験