仕事に効くコンピュータサイエンス
積む・並ぶ・引く — データ構造読了目安 10分

積み戻すか、並ばせるか — スタックとキュー

急ぎの電話を受けて作業を中断し、電話を終えたらまた作業に戻る。その一方で、問い合わせは受け付けた順に対応する。この2つは、似ているようでまったく違う仕組みです。何が違うのか、なぜ使い分けが必要なのかを、このページで整理します。

スタックとキューの直感

コンピュータ科学では、ものを「ためて、あとで取り出す」仕組みに、大きく2つの型があります。

1つはスタックです。積み上げた本の山を思い浮かべてください。本を取るときは、いちばん上に置いた本から取ります。あとから積んだものが先に取り出される仕組みで、これを「後入れ先出し」と呼びます。皿洗いのあとに重ねた皿を、いちばん上から使うのと同じ動きです。

もう1つはキューです。行列を思い浮かべてください。列の先頭にいる人、つまりいちばん先に並んだ人から順番に呼ばれます。先に入れたものが先に出てくる仕組みで、これを「先入れ先出し」と呼びます。コンピュータの中では、印刷待ちの書類が送信した順に印刷されるのも、この仕組みによるものです。

どちらも「たまったものを1つずつ取り出す」という点は同じです。違うのは、取り出す順番の基準だけです。この基準の違いが、仕事の現場では大きな差になります。

もう少し具体的に、コンピュータの中でこの2つがどう使われているかを見てみます。プログラムが関数を呼び出すとき、呼び出した順番と、処理が終わって戻る順番は逆になります。関数Aが関数Bを呼び、Bが関数Cを呼んだ場合、先に終わるのはCで、次にB、最後にAが終わります。これはまさにスタックの動きです。呼び出しのたびに「戻り先」を積み上げ、終わるたびに一番上から取り出しているのです。一方、印刷の依頼やメッセージの配信では、送った順番のとおりに処理されることが期待されます。これがキューの動きで、順番を保証すること自体が仕組みの目的になっています。

つまりスタックは「作業の中断と再開の順序を正しく保つ」ための構造であり、キューは「受け付けた順序をそのまま保つ」ための構造です。どちらも「順序を保つ」という共通の役割を持ちながら、保つべき順序の向きが逆になっている、と捉えると整理しやすくなります。

仕事の言葉に翻訳する

スタックは、割り込みの多い仕事の実態にそのまま当てはまります。作業Aをしている途中に作業Bが割り込み、Bをしている途中にさらに作業Cが割り込む。Cが終わればBに戻り、Bが終わればAに戻る。戻る順番は、割り込まれた順の逆、つまり最後に中断した順です。これは意図して設計したものではなく、割り込みが起きるたびに自然とそうなってしまう構造です。

キューは、公平さが求められる仕事にそのまま当てはまります。問い合わせ対応、依頼の受付、順番待ちのチケット発行。これらは「あとから来た人を先に処理する」ことが許されない業務です。先着順を守ること自体が、依頼主との信頼関係を支える土台になっています。

つまり、スタックは「直前の状況を覚えておいて、あとで正確に戻る」ことに向いた構造であり、キューは「公平に、抜け漏れなく順番を守る」ことに向いた構造です。どちらが優れているという話ではなく、仕事の性質に応じてどちらを選ぶかが問われます

具体場面で見る

場面1: 割り込みの多い問い合わせ対応

サポート担当者が1件目の問い合わせに対応している最中に、2件目、3件目と立て続けに問い合わせが入ったとします。このとき、対応の順番を「最後に来たものから」にしてしまうと、1件目の相手はいつまでも待たされます。割り込みが起きても、対応の順番自体はキューで管理し、「今どの作業を中断しているか」だけをスタック的に覚えておく、という使い分けが必要です。順番を守る部分と、中断状態を覚えておく部分を混同すると、両方とも崩れます

場面2: 資料作成の中断と再開

週次報告の資料を作っている途中で、上司から急ぎの確認依頼が入ったとします。確認依頼を終えたら、報告資料の作成に戻ります。このとき「どこまで書いたか」「次に何をするつもりだったか」をメモに残しておくと、戻ったときにすぐ再開できます。メモがないと、思い出すためだけに数分から十数分かかることがあります。これは、スタックに積む情報が「作業の続き」だけでなく「戻るための手がかり」も含む、という気づきです。

場面3: 引き継ぎの列

複数人が同じ業務を順番に引き継ぐ場合、引き継ぎの順番は基本的にキューで管理すべきです。先に依頼された案件を後回しにして、あとから来た案件を優先すると、最初に依頼した人が置き去りにされ、進捗の見通しが立たなくなります。「困っている人から先に対応する」という例外を作るなら、それは次のページで扱う優先度付きキューへの切り替えであり、単純なキューのままではありません。

場面4: 会議のアジェンダと質疑応答

会議のアジェンダは、基本的にキューです。決められた議題を順番に扱い、飛ばしたり後回しにしたりすると、あとの議題を担当する人の時間配分が狂います。ところが質疑応答の場面では、直前の発言に関連する質問を優先して受けることがあります。これは会議全体の進行はキューで保ちながら、その場の発言のやり取りだけを一時的にスタック的に扱っている状態です。全体の構造と、局所的な扱いを混同しないことが大切です。

混同すると起きること

スタックとキューは、どちらも「順番」を扱う点で似ているため、無意識に混同されがちです。混同が起きやすいのは、次の2つの条件が同時に成り立つときです。1つは、対応すべき件数が多く、頭の中だけで管理しようとしているとき。もう1つは、割り込みと通常の依頼が同じ受付口から入ってくるときです。

たとえば共有の受信箱に、通常の依頼メールと、上司からの緊急確認メールが混在しているとします。このとき無意識に「新しく届いたものから読む」という習慣がついていると、本来はキューで先着順に扱うべき通常の依頼が、後回しにされ続けます。逆に、緊急の依頼までキューのルールに従って律儀に順番待ちさせてしまうと、本当に急ぐべき案件の対応が遅れます。どちらも「受付口を分けていない」ことが根本の原因です。緊急かどうかを最初に見分け、通常の依頼はキューへ、割り込みはスタック的な扱いへと振り分ける小さな仕分けの手間が、混同を防ぐ鍵になります。

2つを組み合わせて設計する

実際の仕事では、スタックとキューのどちらか一方だけで済むことは、むしろ少数派です。多くの現場は、この2つを組み合わせて設計されています。

たとえば、依頼受付の窓口業務を思い浮かべてください。通常の依頼はキューに積み、受け付けた順に対応します。そこに緊急の割り込みが入ったら、今対応している依頼をいったん脇に置き、「どこまで終えたか」をスタックに積んでから、緊急対応に移ります。緊急対応が終わったら、スタックから直前の状態を取り出し、通常の依頼への対応を再開します。再開が終わったら、キューの続きに戻ります。

このように、全体の受付順序はキューで守り、局所的な中断と再開はスタックで管理する、という二層構造にすると、公平さと機動力の両方を保てます。一層しか用意していない現場、たとえば「全部を1つの受信箱に入れて上から対応する」という運用は、どちらの構造の利点も得られず、両方の欠点だけを引き受けることになりがちです。受付の窓口を「通常」と「割り込み」で分けるだけでも、この二層構造に近づきます。

落とし穴・誤用

いちばん多い誤用は、キューであるべき仕事をスタックのように扱ってしまうことです。目についた新しい依頼から手を付け、古い依頼を後回しにし続けると、その依頼は最悪の場合、放置されたまま忘れられます。締切のない依頼ほどこの罠にかかりやすく、気づいたときには大きく遅れています。

逆に、スタックであるべき割り込み処理をキューのように扱う誤用もあります。割り込みへの対応をいったん列に並ばせてしまうと、急ぎで中断した本来の作業に戻るタイミングを逃し、中断した状態のまま長時間放置されることになります。戻る約束を先延ばしにするほど、再開のための思い出しコストが膨らみます。

もう1つの落とし穴は、スタックの「積みすぎ」です。割り込みが何重にも重なると、戻るべき場所も何重にも積み上がります。3つ、4つと中断が重なった状態は、頭の中だけで管理するには無理があります。コンピュータの世界でも、積み上げる量には物理的な上限があり、それを超えるとプログラムが異常終了します。人間の頭も同じで、積みすぎれば「何をどこまでやっていたか」を正確に思い出せなくなります。中断した作業を書き出しておく、という単純な工夫だけでも、積みすぎによる取りこぼしをかなり減らせます。

さらに見落とされがちなのが、キューの「順番を守りすぎる」落とし穴です。先着順を絶対のルールとして固定してしまうと、明らかに軽微な依頼と、明らかに重大な依頼が同じ列に並んだとき、重大な依頼が軽微な依頼のうしろで長時間待たされることになります。キューは公平さを守る構造であって、重要度を判断する構造ではありません。重要度で並べ替える必要が出てきた時点で、それはキューではなく、次のページで扱う優先度付きキューへ切り替えるべきだ、という合図です。

自分の受付口を数えてみる

自分の仕事を振り返るとき、まず「今、依頼がどこから入ってくるか」を数えてみてください。メール、チャット、対面での声かけ、上司からの直接指示。入り口が多いほど、どれがキューでどれがスタックなのかが曖昧になりやすくなります。入り口ごとに「これは先着順で扱う」「これは割り込みとして扱う」と決めておくだけで、毎回その場で判断する負担が減ります。決めたルールは頭の中だけに置かず、付箋やメモに一言書き出しておくと、忙しいときほど頼りになります。

持ち帰り

  • スタックは「後入れ先出し」で割り込み仕事に向き、キューは「先入れ先出し」で順番仕事に向く
  • 公平さが求められる依頼対応はキューで、直前の状況を覚えて戻る作業はスタックで扱う
  • 依頼の入り口ごとに、先着順で扱うか割り込みとして扱うかを事前に決め、戻る場所は書き出しておく

やってみる

今抱えている中断中の作業を1つ、どこまで終えたかと次に何をするつもりかをメモに書き出してみてください。あわせて、その作業がスタック的な割り込みで止まっているのか、キューの順番待ちで止まっているのかも確認してみましょう。