java stack tutorial stack class implementation with examples
このチュートリアルでは、Javaのスタック、Javaスタッククラス、スタックAPIメソッド、配列とリンクリストを使用したスタックの実装について、例を使用して説明します。
スタックは、Javaコレクションフレームワークに属する順序付けられたデータ構造です。このコレクションでは、要素は一方の端からのみ追加および削除されます。要素が追加および削除される終了は、「スタックのトップ」と呼ばれます。
追加と削除は一方の端でのみ行われるため、スタックに追加された最初の要素は、スタックから削除された最後の要素になります。したがって、スタックはLIFO(後入れ先出し)データ構造と呼ばれます。
学習内容:
Javaスタックコレクション
スタックの図解を以下に示します。

上記の一連の表現に示されているように、最初はスタックが空で、スタックの最上位が-1に設定されています。次に、スタックに要素を追加するために使用される「プッシュ」操作を開始します。
したがって、2番目の表現では、要素10をプッシュします。この時点で、上部がインクリメントされます。スタック内の要素20を再度押して、トップをさらにインクリメントします。
最後の表現では、「ポップ」操作を開始します。この操作は、スタックから要素を削除するために使用されます。現在「トップ」を指している要素は、ポップ操作によって削除されます。
Windows用の最高の無料ビデオコンバーター
スタックデータ構造は、次の操作をサポートします。
- 押す: スタックに要素を追加します。その結果、topの値が増加します。
- ポップ: 要素がスタックから削除されます。ポップ操作の後、トップの値がデクリメントされます。
- ピーク: この操作は、要素を検索または検索するために使用されます。 topの値は変更されません。
スタックから要素を追加/削除するための終わりとして使用されるスタックの最上位も、特定の瞬間にさまざまな値を持つことができます。スタックのサイズがNの場合、スタックの最上位は、スタックの状態に応じて、さまざまな条件で次の値になります。
| スタックのステータス | 最高値 |
|---|---|
| 空のスタック | -1 |
| スタック内の1つの要素 | 0 |
| スタックがいっぱい | N-1 |
| オーバーフロー(要素> N) | N |
Javaのスタッククラス
Java Collection Frameworkは、「Stack」という名前のクラスを提供します。このStackクラスは、Vectorクラスを拡張し、Stackデータ構造の機能を実装します。
次の図は、Stackクラスの階層を示しています。

上の図に示すように、StackクラスはVectorクラスを継承し、VectorクラスはCollectionインターフェイスのListインターフェイスを実装します。
Stackクラスはjava.utilパッケージの一部です。プログラムにStackクラスを含めるには、次のようにimportステートメントを使用できます。
import java.util.*; または
import java.util.Stack; Javaでスタックを作成する
Stackクラスをインポートすると、次のようにStackオブジェクトを作成できます。
Stack mystack = new Stack(); 次のように、ジェネリック型のStackクラスオブジェクトを作成することもできます。
Stack myStack = new Stack; ここで、data_typeは、Javaで有効な任意のデータ型にすることができます。
例えば 、次のStackクラスオブジェクトを作成できます。
Stack stack_obj = new Stack(); Stack str_stack = new Stack(); JavaでのスタックAPIメソッド
Stackクラスは、Stack内のデータを追加、削除、および検索するためのメソッドを提供します。また、スタックが空かどうかを確認する方法も提供します。これらの方法については、以下のセクションで説明します。
スタックプッシュ操作
プッシュ操作は、要素をスタックにプッシュまたは追加するために使用されます。スタックインスタンスを作成したら、プッシュ操作を使用して、スタックオブジェクトタイプの要素をスタックに追加できます。
次のコードは、整数スタックを値で初期化するために使用されます。
Stack myStack = new Stack(); myStack.push(10); myStack.push(15); myStack.push(20); 上記のコード実行の結果として得られた初期スタックを以下に示します。

以下に示すように別のpush()操作を実行すると、
push(25); 結果のスタックは次のようになります。

スタックポップ操作
「ポップ」操作を使用して、スタックから要素を削除できます。現在Topが指している要素は、スタックからポップされます。
次のコードはこれを実現します。
Stack intStack = new Stack(); intStack.push(100); intStack.push(200); int val = intStack.pop(); 変数valには、スタックにプッシュされた最後の要素である値200が含まれます。
プッシュおよびポップ操作のスタック表現は次のとおりです。

スタックピーク操作
ピーク操作は、要素を削除せずにスタックの最上位を返します。上記のスタックの例では、「intStack.peek()」は200を返します。
スタックisEmpty操作
StackクラスのisEmpty()操作は、スタックオブジェクトが空かどうかをチェックします。スタックに要素がない場合はtrueを返し、それ以外の場合はfalseを返します。
スタック検索操作
search()操作を使用して、スタック上の要素を検索できます。 search()操作は、検索対象の要素のインデックスを返します。このインデックスは、スタックの最上位からカウントされます。
Stack intStack = new Stack (); intStack.push (100); intStack.push (200); int index = inStack.search(100); //index will have the value 2.スタックサイズ
Stackオブジェクトのサイズは、 java.util.Stack.size() 方法。スタック内の要素の総数を返します。
次の例では、スタックサイズを出力します。
Stack myStack = new Stack(); myStack.push(100); myStack.push(200); myStack.push(300); System.out.println('Stack size:' + myStack.size()); //Stack size: 3 スタック要素の印刷/反復
スタックのイテレーターを宣言してから、このイテレーターを使用してスタック全体をトラバースできます。このようにして、各スタック要素に1つずつアクセスして印刷できます。
次のプログラムは、イテレータを使用してスタックを反復する方法を示しています。
import java.util.*; public class Main { public static void main(String() args) { //declare and initialize a stack object Stack stack = new Stack(); stack.push('PUNE'); stack.push('MUMBAI'); stack.push('NASHIK'); System.out.println('Stack elements:'); //get an iterator for the stack Iterator iterator = stack.iterator(); //traverse the stack using iterator in a loop and print each element while(iterator.hasNext()){ System.out.print(iterator.next() + ' '); } } }出力:
スタック要素:
プネムンバイナーシク

Java8を使用したスタック
Stream API、forEach、forEachRemainingコンストラクトなどのJava 8機能を使用して、スタック要素を印刷またはトラバースすることもできます。
次のプログラムは、スタックをトラバースするためのJava8コンストラクトの使用法を示しています。
import java.util.*; import java.util.stream.*; public class Main { public static void main(String() args) { //declare and initialize a stack object Stack stack = new Stack(); stack.push('PUNE'); stack.push('MUMBAI'); stack.push('NASHIK'); System.out.println('Stack elements using Java 8 forEach:'); //get a stream for the stack Stream stream = stack.stream(); //traverse though each stream object using forEach construct of Java 8 stream.forEach((element) -> { System.out.print(element + ' '); // print element }); System.out.println('
Stack elements using Java 8 forEachRemaining:'); //define an iterator for the stack Iterator stackIterator = stack.iterator(); //use forEachRemaining construct to print each stack element stackIterator.forEachRemaining(val -> { System.out.print(val + ' '); }); } } 出力:
Java 8 forEachを使用して要素をスタックします。
プネムンバイナーシク
Java 8 forEachRemainingを使用して要素をスタックします。
プネムンバイナーシク

Javaでのスタック実装
次のプログラムは、さまざまなスタック操作を示す詳細なスタックを実装します。
import java.util.Stack; public class Main { public static void main(String a()){ //declare a stack object Stack stack = new Stack(); //print initial stack System.out.println('Initial stack : ' + stack); //isEmpty () System.out.println('Is stack Empty? : ' + stack.isEmpty()); //push () operation stack.push(10); stack.push(20); stack.push(30); stack.push(40); //print non-empty stack System.out.println('Stack after push operation: ' + stack); //pop () operation System.out.println('Element popped out:' + stack.pop()); System.out.println('Stack after Pop Operation : ' + stack); //search () operation System.out.println('Element 10 found at position: ' + stack.search(10)); System.out.println('Is Stack empty? : ' + stack.isEmpty()); } } 出力:
初期スタック:()
スタックは空ですか? :true
プッシュ操作後のスタック:(10、20、30、40)
飛び出した要素:40
ポップ操作後のスタック:(10、20、30)
位置にある要素10:3
スタックは空ですか? :false

Javaでスタックから配列へ
スタックデータ構造は、Stackクラスの「toArray()」メソッドを使用して配列に変換できます。
次のプログラムは、この変換を示しています。
import java.util.*; import java.util.stream.*; public class Main { public static void main(String() args) { //declare and initialize a stack object Stack stack = new Stack(); stack.push('PUNE'); stack.push('MUMBAI'); stack.push('NASHIK'); //print the stack System.out.println('The Stack contents: ' + stack); // Create the array and use toArray() method to convert stack to array Object() strArray = stack.toArray(); //print the array System.out.println('The Array contents:'); for (int j = 0; j 出力:
スタック内容:(プネ、ムンバイ、ナーシク)
アレイの内容:
プネムンバイナーシク

配列を使用したJavaでのスタック実装
スタックは、配列を使用して実装できます。すべてのスタック操作は、配列を使用して実行されます。
以下のプログラムは、配列を使用したスタックの実装を示しています。
import java.util.*; //Stack class class Stack { int top; //define top of stack int maxsize = 5; //max size of the stack int() stack_arry = new int(maxsize); //define array that will hold stack elements Stack(){ //stack constructor; initially top = -1 top = -1; } boolean isEmpty(){ //isEmpty () method return (top <0); } boolean push (int val){ //push () method if(top == maxsize-1) { System.out.println('Stack Overflow !!'); return false; } else { top++; stack_arry(top)=val; return true; } } boolean pop () { //pop () method if (top == -1) { System.out.println('Stack Underflow !!'); return false; } else { System.out.println('
Item popped: ' + stack_arry(top--)); return true; } } void display () { //print the stack elements System.out.println('Printing stack elements .....'); for(int i = top; i>=0;i--) { System.out.print(stack_arry(i) + ' '); } } } public class Main { public static void main(String() args) { //define a stack object Stack stck = new Stack(); System.out.println('Initial Stack Empty : ' + stck.isEmpty()); //push elements stck.push(10); stck.push(20); stck.push(30); stck.push(40); System.out.println('After Push Operation...'); //print the elements stck.display(); //pop two elements from stack stck.pop(); stck.pop(); System.out.println('After Pop Operation...'); //print the stack again stck.display(); } } 出力:
初期スタックが空です:true
プッシュ操作後…
スタック要素の印刷…..
40 30 20 10
ポップされたアイテム:40
ポップされたアイテム:30
ポップ操作後…
スタック要素の印刷…..
2010

リンクリストを使用したスタックの実装
スタックは、配列を使用した場合と同じように、リンクリストを使用して実装することもできます。スタックを実装するためにリンクリストを使用する利点の1つは、動的に拡大または縮小できることです。配列のように最大サイズの制限を設ける必要はありません。
次のプログラムは、スタック操作を実行するためのリンクリストを実装しています。
import static java.lang.System.exit; // Stack class using LinkedList class Stack_Linkedlist { // Define Node of LinkedList private class Node { int data; // node data Node nlink; // Node link } // top of the stack Node top; // stack class Constructor Stack_Linkedlist() { this.top = null; } // push () operation public void push(int val) { // create a new node Node temp = new Node(); // checks if the stack is full if (temp == null) { System.out.print('
Stack Overflow'); return; } // assign val to node temp.data = val; // set top of the stack to node link temp.nlink = top; // update top top = temp; } // isEmpty () operation public boolean isEmpty() { return top == null; } // peek () operation public int peek() { // check if the stack is empty if (!isEmpty()) { return top.data; } else { System.out.println('Stack is empty!'); return -1; } } // pop () operation public void pop() { // check if stack is out of elements if (top == null) { System.out.print('
Stack Underflow!!'); return; } // set top to point to next node top = (top).nlink; } //print stack contents public void display() { // check for stack underflow if (top == null) { System.out.printf('
Stack Underflow!!'); exit(1); } else { Node temp = top; System.out.println('Stack elements:'); while (temp != null) { // print node data System.out.print(temp.data + '->'); // assign temp link to temp temp = temp.nlink; } } } } public class Main { public static void main(String() args) { // Create a stack class object Stack_Linkedlist stack_obj = new Stack_Linkedlist(); // push values into the stack stack_obj.push(9); stack_obj.push(7); stack_obj.push(5); stack_obj.push(3); stack_obj.push(1); // print Stack elements stack_obj.display(); // print current stack top System.out.println('
Stack top : ' + stack_obj.peek()); // Pop elements twice System.out.println('Pop two elements'); stack_obj.pop(); stack_obj.pop(); // print Stack elements stack_obj.display(); // print new stack top System.out.println('
New Stack top:' + stack_obj.peek()); } } 出力:
スタック要素:
1-> 3-> 5-> 7-> 9->
スタックトップ:1
2つの要素をポップします
スタック要素:
5-> 7-> 9->
新しいスタックトップ:5

よくある質問
Q#1)Javaのスタックとは何ですか?
回答: スタックは、要素を格納するためのLIFO(後入れ先出し)データ構造です。スタック要素は、スタックのトップと呼ばれる一方の端からスタックに追加またはスタックから削除されます。
スタックへの要素の追加は、プッシュ操作を使用して行われます。要素の削除は、ポップ操作を使用して行われます。 Javaでは、スタックはStackクラスを使用して実装されます。
Q#2)StackはJavaのコレクションですか?
回答: はい。スタックはJavaのレガシーコレクションであり、Java1.0以降のCollectionAPIから利用できます。 Stackは、ListインターフェイスのVectorクラスを継承します。
Q#3)スタックはインターフェースですか?
回答: インターフェイススタックは、後入れ先出し構造を記述するインターフェイスであり、再帰的な問題の状態を格納するために使用されます。
Q#4)スタックは何に使用されますか?
回答:スタックの主なアプリケーションは次のとおりです。
- 式の評価と変換:スタックは、式を後置、中置、および接頭辞に変換するために使用されます。これらの式を評価するためにも使用されます。
- スタックは、構文ツリーの解析にも使用されます。
- スタックは、式の括弧をチェックするために使用されます。
- スタックは、バックトラッキングの問題を解決するために使用されます。
- 関数呼び出しは、スタックを使用して評価されます。
Q#5)スタックの利点は何ですか?
回答: スタックに格納されている変数は、返されると自動的に破棄されます。スタックは、メモリの割り当てと割り当て解除を行う場合に適しています。スタックもメモリをクリーンアップします。それとは別に、スタックを効果的に使用して、式を評価し、式を解析できます。
結論
これで、Javaのスタックに関するチュートリアルは完了です。スタッククラスはコレクションAPIの一部であり、プッシュ、ポップ、ピーク、および検索操作をサポートします。要素は、一方の端でのみスタックに追加またはスタックから削除されます。この端はスタックのトップと呼ばれます。
YouTubeの動画をダウンロードするための最高のアプリ
このチュートリアルでは、スタッククラスでサポートされているすべてのメソッドを見てきました。また、配列とリンクリストを使用してスタックを実装しました。
以降のチュートリアルでは、他のコレクションクラスに進みます。
推奨読書


