JavaのArrayDequeクラスのスタック(Stack)のサンプルです。
目次
説明 | ArrayDequeクラスとは |
ArrayDequeクラスとDequeインターフェースの関係 | |
サンプル | 要素を追加する (pushメソッド) |
要素を取得してスタックから削除する (pollFirstメソッド) | |
要素を取得してスタックから削除する (popメソッド) | |
要素を取得してスタックから削除しない (peekメソッド) |
ArrayDequeクラスとは
使用例
Deque<String> color = new ArrayDeque<>(); color.push("赤"); color.push("青"); |
1つの変数で複数の値を保持できます。
上記はArrayDequeクラスをインスタンス化してDequeインターフェイス型の変数に代入しています。 この変数colorはスタックとして使用できます(※)。
<>はジェネリクスです。変数colorの各値はStringのみセット可能です。
※キューとしても使用可能です。
ArrayDequeの変数のイメージ(スタック)
スタックの機能
スタックとは、後に入れたデータが、先に取り出されることです。
「後入れ先出し」といいます。英語では LIFO(Last In First Out)です。
要素
各項目を要素(element)といいます。
1つの変数で同じ型の複数の値を保持できます。
値は、StringやIntegerなどの参照型です。int等の基本型は使用できません。
以下はOracleのJava8 API仕様のArrayDequeクラスのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/util/ArrayDeque.html
ArrayDequeクラスとDequeインターフェースの関係
public class ArrayDeque<E> extends AbstractCollection<E> implements Deque<E>, Cloneable, Serializable |
ArrayDequeクラスはDequeインターフェースを実装しています。
使用例
Deque<String> a = new ArrayDeque<>(); |
ArrayDequeクラスをインスタンス化する時、ArrayDequeクラスの独自のメソッドを使用しない限り、Dequeインターフェイス型の変数に代入することが多いです。
Dequeインターフェイスにあるメソッドを使用できます。
以下はOracleのJava8 API仕様のDequeインターフェースのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/util/Deque.html
要素を追加する (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);//青 黄 赤 LIFO(Last In First Out)
}
colors.push("白"); // 追加
for (String a : colors) {
System.out.println(a);//白 青 黄 赤 LIFO(Last In First Out)
}
}
}
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の要素は削除しません。
関連の記事