Java スタック(Stack)のサンプル(ArrayDequeクラス)

JavaのArrayDequeクラスのスタック(Stack)のサンプルです。

目次

説明 ArrayDequeクラスとは
  ArrayDequeクラスとDequeインターフェースの関係
サンプル 要素を追加する (pushメソッド)
  要素を取得してスタックから削除する (pollFirstメソッド)
  要素を取得してスタックから削除する (popメソッド)
  要素を取得してスタックから削除しない (peekメソッド)

ArrayDequeクラスとは

ArrayDequeクラスの定義

public class ArrayDeque<E>
extends AbstractCollection<E> // 継承するクラス
implements Deque<E>, Cloneable, Serializable // 実装するインターフェース

使用例

Deque<String> a = new ArrayDeque<>();

上記はArrayDequeクラスをインスタンス化してDequeインターフェイス型の変数に代入しています。 この変数aはスタックとして使用できます。※キューとしても使用可能です。
<>はジェネリクスです。変数の中身はStringであると宣言しています。

 

ArrayDequeのスタックで使用するときの変数の図

  • 1つの変数で同じ型の複数の値を保持できます。
    →各項目を要素(element)といいます。
    →値は、StringやIntegerなどの参照型です。intなどの基本型は使用できません。
  • スタックの機能を持ちます。
  • スタックとは、後に入れたデータが、先に取り出されることです。
    後入れ先出し」といいます。英語では LIFO(Last In First Out)です。
  • バージョン1.6で導入されました。
  • 以下はOracleのJava8 API仕様のArrayDequeクラスのリンクです。
    https://docs.oracle.com/javase/jp/8/docs/api/java/util/ArrayDeque.html

 

ArrayDequeクラスとDequeインターフェースの関係

ArrayDequeクラスはDequeインターフェースを実装しています。

public class ArrayDeque<E>
extends AbstractCollection<E>
implements Deque<E>, Cloneable, Serializable

上記はArrayDequeクラスの定義です。implementsが実装している箇所です。
ArrayDequeクラスは、Dequeインターフェースを実装しているので、Dequeインターフェイスにあるメソッドを使用できます。
以下はOracleのJava8 API仕様のDequeインターフェースのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/util/Deque.html

 

Deque<String> a = new ArrayDeque<>();

ArrayDequeクラスをインスタンス化する時、ArrayDequeクラスの独自のメソッドを使用しない限り、Dequeインターフェイス型の変数に代入することが多いです。

 

要素を追加する (pushメソッド)

public void push(E e)
package test1;
import java.util.ArrayDeque;
import java.util.Deque;

public class Test1 {
    public static void main(String[] args) {
    	Deque<String> colors = new ArrayDeque<>();
        colors.push("赤");
        colors.push("黄");
        colors.push("青");
        
        for (String a : colors) {
            System.out.println(a);//青 黄 赤
        }
        
        colors.push("白");
        
        for (String a : colors) {
            System.out.println(a);//白 青 黄 赤 
        }
    }
 }

7行目は、ArrayDequeクラスをインスタンス化してDequeインターフェイス型の変数に代入しています。ジェネリクス<>でオブジェクトの中身はStringであると宣言しています。
8~10行目は、pushメソッドで要素を追加しています。
16行目は、要素を追加しています。
13,19行目は、後に入れたデータが、先に取り出されています。

要素を取得してスタックから削除する (pollFirstメソッド) 

public E pollFirst()
package test1;
import java.util.ArrayDeque;
import java.util.Deque;

public class Test1 {
    public static void main(String[] args) {
        
    	Deque<String> colors = new ArrayDeque<>();
        colors.push("赤");
        colors.push("黄");
        
        String a = colors.pollFirst();
        System.out.println(a); //黄
        System.out.println(colors); //[赤]
        
        String b = colors.pollFirst();
        System.out.println(b); //赤
        System.out.println(colors); //[]
        
        String c = colors.pollFirst();
        System.out.println(c); //null
        System.out.println(colors); //[]
    }
 }

12~18行目は、pollFirstメソッドでスタックから要素を取得してスタックの要素を削除しています。
20行目は、要素がない変数に対してpollFirstメソッドを実行しています。
21行目は、nullになります。エラーになりません。(popとの違い)

要素を取得してスタックから削除する (popメソッド)

public E pop()
package test1;
import java.util.ArrayDeque;
import java.util.Deque;

public class Test1 {
    public static void main(String[] args) {
        
    	Deque<String> colors = new ArrayDeque<>();
        colors.push("赤");
        colors.push("黄");
        
        String a = colors.pop();
        System.out.println(a); //黄
        System.out.println(colors); //[赤]
        
        String b = colors.pop();
        System.out.println(b); //赤
        System.out.println(colors); //[]
        
        String c = colors.pop(); //例外が発生
//        System.out.println(c); //
//        System.out.println(colors); //
    }
 }

12~18行目は、popメソッドでスタックから要素を取得してスタックの要素を削除しています。
20行目は、要素がない変数に対してpopメソッドを実行しています。java.util.NoSuchElementExceptionの例外が発生が発生します。(pollFirstとの違い)

要素を取得してスタックから削除しない (peekメソッド)

public E peek()
package test1;
import java.util.ArrayDeque;
import java.util.Deque;

public class Test1 {
    public static void main(String[] args) {
    	Deque<String> colors = new ArrayDeque<>();
        colors.push("赤");
        colors.push("黄");
        colors.push("青");
        
        String b = colors.peek();
        
        System.out.println(colors); //[青, 黄, 赤]
        System.out.println(b); //青
    }
 }

12行目は、最後に追加した要素"青"を取得して変数bにセットしています。pollFirstメソッドやpopメソッドと違い、変数colorsの要素は削除しません。

関連の記事

Java キュー(Queue)のサンプル(ArrayDequeクラス)

△上に戻る