2016-07-18 7 views
2

私はJavaで配列をコアとして使用してスタックを実装しようとしています。これは、スタックの仕組みを学び理解する目的に過ぎません。Javaで配列を使用してスタックを実装

私の考えはArray(ArrayListではない)を使用し、Stack構造を模倣しようとしました。この実装は静的なサイズを持ちます。空のスタックを示す-1で始まるポインタがあります。要素を追加するとポインタが増加します。要素を削除することについて心配する必要はありません。そのスペース(インデックス)が必要になると値を上書きするためです。

以下は、私のソースコードであるといくつかの質問で従います:

import java.util.*; 

public class stackUsingArray{ 

    private int[] myStack; 
    private int pointer; 

    /** 
    -Constructor 
    */ 
    public stackUsingArray() 
    { 
     myStack = new int[10]; 
     pointer = -1;//keep track of where the top element is on the stack. 
    } 

    /** 
    -Pop method 
    */ 
    public int pop() 
    {  
     if(pointer==-1) 
     { 
      //throw exception here 
     } 
     return myStack[pointer--]; 
    } 

    /** 
    -Push when the stack is not empty. 
    */ 

    public void push(int num) 
    { 
     if(pointer== myStack.size()-1) 
     { 
      //throw exception here 
     } 
     else 
     { 
      myStack[++pointer] = num;//add to the stack   
     }  
    } 

/** 
-return the top element of the stack 
*/ 
    public void peek() 
    { 
     return pointer; 
    } 

/** 
-return false if there is not more element on the stack 
*/ 
    public boolean isEmpty() 
    { 
     return (pointer == -1)? true : false; 
    } 

    public static void main(String [] arg) 
    { 
     stackUsingArray newStack = new stackUsingArray(); 
     newStack.push(1); 
     newStack.push(2); 
     newStack.push(3); 

     System.out.println(newStack.pop()); 
    } 
} 

私はスロー例外としてコメント部には:

public int pop() 
     {  
      if(pointer==-1) 
      { 
       //throw exception here 
      } 
      return myStack[pointer--]; 
     } 

が必要になります例外はどんな思います最も論理的?ほとんどの場合、私は画面上に印刷します。しかし、私は例外をスローする方法を学ぶことが大好きです。

この部分:自身がmyStack.sizeの操作を行う必要があります()-1

public void push(int num) 
    { 
     if(pointer== myStack.size()-1) 
     { 
      //throw exception here 
     } 
     else 
     { 
      myStack[++pointer] = num;//add to the stack   
     }  
    } 

プログラム。私はクラス-1にサイズ-1を保持するプライベートメンバーを持つ方が良いのだろうか?私は順番に効率を意味します。

また、このスタックを実装するためにArrayListを使用する場合は、それはより効率的に実行されますか?つまり、ArrayListにはメソッドの内部呼び出しなどのオーバーヘッドがたくさんあります。

最後に、私のコードは素晴らしくないことを知っていますので、より良くするためにいくつかアドバイスをしてください!

+0

Javaには既にStackクラスがありますか? http://www.tutorialspoint.com/java/java_stack_class.htm – SPlatten

+1

@ SPlatten彼はそれがどのように機能するかをよりよく理解しようとしています。 – indjev99

+0

@SPlatten Uは私が最初に書いた内容を尋ねる前に読んでいたはずです。とにかく、リンクをありがとう。 –

答えて

1

RuntimeExceptionから派生したカスタムStackEmptyException/StackFullExceptionをスローして、チェックが外されるようにします。チェックを外すと、ユーザーはtry/catch内のすべてのpop()を囲む必要はありません。チェックされた例外をスローした場合は、すべてのポップを試してみるか、独自のメソッドを宣言して例外をスローする必要があります。詳細は、この説明を参照してください:Java: checked vs unchecked exception explanation

自体がmyStack.sizeの操作を行う必要がありますプログラムを()-1。私はクラス-1にサイズ-1を保持するプライベートメンバーを持つ方が良いのだろうか?私は順番に効率を意味します。

それは、全く顕著ではありませんだけで、あなたにプロセッササイクルまたは2を惜しまます最適化を行いませんが、アルゴリズムの複雑さやI/O操作の回数を減らすもの。

また、私たちはこのスタックを実装するためのArrayListを使用した場合。それはより効率的に実行されますか?つまり、ArrayListにはメソッドの内部呼び出しなどのオーバーヘッドがたくさんあります。

アレイを内部的に拡張する場合は、独自の実装と同じ動作をします。

最後に、私は私のコードは素晴らしいではありません知っているので、それを改善するために私にいくつかアドバイスをお願いします!どうもありがとうございます!

それは良い仕事を続ける、学習プロジェクトのためにかなり良いです。)

+0

ありがとうございました!私はあなたから多くを学んだ! –

1

スタックが空のときに投げるための最も論理的な例外は議論の余地があるが、私はIllegalStateExceptionが一緒に行くと思います。

throw new IllegalStateException("An empty stack cannot be popped."); 

また、配列ではなく配列を直接使用します。配列では、自分自身でインデックスをオーバーフローさせる必要がありますが、ArrayListはそれを内部的にかなり効率的に処理します。 ArrayListに何かを追加し、配列サイズが足りなくなるたびに、古い配列の2倍のサイズの新しい配列にデータをコピーします。これにより、イベントの相対的な希少性のため、O(1)の償却加算時間が与えられます。

ArrayListを使用すると、ArrayListのサイズを確認できるようにスタックカウンタを削除する可能性があります。スタックをポップする際にエントリを削除する必要がないという利点が失われる可能性があります(ArrayListがそれを最適化するかどうかは思い出せません)。

コードスタイルの問題として、大文字のクラス名を使用するのはJavaの慣例なので、クラス名を規約に準拠させるように変更する必要があります。

あなたのpeekメソッドはvoidと宣言され、myStack [pointer]を返す必要があります。また、pushメソッドでは、myStack.size()を呼び出すと配列が正しくありません。 ArrayListを使用するように切り替えていない場合は、myStack.lengthを使用します。

+0

コードを明確にすることが個人的には、ポインタが意味することを「ポインタ」に明確にすることです。おそらくnextFreeElementのようなものを呼び出すと0に初期化してください。 –

+0

ArrayListの時間の複雑さのために@jvalli +1!命名規則とエラーのために+2以上!ご助力ありがとうございます! –

+0

@matthelliwell私はあなたの名前付けに同意します!私は次回にそのことを心に留めておきます。私が指摘したいことは、Arrayを使用し、インデックス開始が0(ゼロ)であるため、開始値として0を使用できないことです。 –

関連する問題