Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaでキュー(Queue)を使ってスタック(Stack)を実装する方法

Stack(スタック)Vectorクラスのサブクラスであり、オブジェクトを後入れ先出し(LIFO:Last-In-First-Out)で管理するデータ構造です。スタックの最上部に最後に追加された要素が、最初に取り出される要素になります。

一方、Queue(キュー)Collectionインターフェースを継承しており、先入れ先出し(FIFO:First-In-First-Out)に基づく挿入(insert)と削除(remove)の操作をサポートします。

一見すると性質の異なるこの2つのデータ構造ですが、キューの使い方を少し工夫するだけで、キューのみを使ってスタックを実装することができます。

キューでスタックを実装する仕組み

ポイントはpush処理にあります。新しい要素をキューに追加した直後に、それまで格納されていた既存の要素をすべて一度取り出しては、もう一度末尾へ追加し直します。この「並べ替え」によって、最新の要素が常にキューの先頭に配置されるようになります。

その結果、pop処理ではキューの先頭要素を削除するだけでよく、スタックと同じLIFO(後入れ先出し)の動作が実現できます。

コード例

import java.util.*;
public class StackFromQueueTest {
    Queue queue = new LinkedList();

    public void push(int value) {
        int queueSize = queue.size();
        queue.add(value);
        // 既存の要素をすべて一度取り出して、新要素の後ろに回す
        for (int i = 0; i < queueSize; i++) {
            queue.add(queue.remove());
        }
    }

    public void pop() {
        System.out.println("スタックから取り出された要素は: " + queue.remove());
    }

    public static void main(String[] args) {
        StackFromQueueTest test = new StackFromQueueTest();
        test.push(10);
        test.push(20);
        test.push(30);
        test.push(40);
        System.out.println(test.queue);
        test.pop();
        System.out.println(test.queue);
    }
}

実行結果

[40, 30, 20, 10]
スタックから取り出された要素は: 40
[30, 20, 10]

動作のポイント

  • push(10)、push(20)、push(30)、push(40) の順に追加すると、キューの内容は [40, 30, 20, 10] となり、最新の値が必ず先頭に来ます。
  • pop() を呼び出すと、先頭の 40 が取り出され、残りのキューは [30, 20, 10] になります。
  • pushのたびに既存要素を回転させるため、pushの計算量はO(n)、popはO(1)となる点に注意してください。
  1. JavaのJToggleButton実装ガイド:ON/OFF切替ボタンの作り方を解説

    JToggleButtonとは JToggleButtonはAbstractButtonを拡張したクラスで、クリックするたびにONとOFFが切り替わるトグルボタンを実現するために使用されます。通常のボタンと異なり、押した状態を保持できるのが特徴です。 JToggleButtonの主な特徴 最初に押されたときは押し込まれた状態のままとなり、もう一度押してはじめて元の状態(押されていない状態)に戻ります。 ボタンが押されるたびにActionEventが発生します。 さらに、JToggleButtonはItemEventも発生させることができます。このイベントは、選択状態という概念を持つコンポー

  2. JavaのJWindowを使ってスプラッシュ画面を実装する方法

    JWindowは、デスクトップ上の任意の位置に表示できるコンテナです。JFrameと異なり、タイトルバーやウィンドウ管理ボタンなどの装飾要素を持ちません。JWindowは、唯一の子クラスとしてJRootPaneを含んでいます。そのcontentPaneが、JWindowに追加される子コンポーネントの親となります。JFrameと同様に、JWindowもトップレベルコンテナの一つであり、「装飾のない(undecorated)JFrame」と考えることができます。タイトルバーやウィンドウメニューといった機能は備えていません。この特性を活かすと、JWindowはスプラッシュ画面として利用できます。アプ