1

私はデータ構造の概念に不慣れで、自分で使用するためにスタックを作成しました。

public class ArrayBasedStackImpl<T> {

@SuppressWarnings("unchecked")
private T[] DataStack= (T[]) new Object[10];
private int stack_pointer=-1;

public void push(T t) throws Exception
{
if(stack_pointer>9)
{
throw new Exception("Stack is full");
}

DataStack[++stack_pointer]=t;
}

public T pop() throws Exception
{
if(stack_pointer==-1)
{
throw new Exception("Stack Empty");
}
else
{
return DataStack[stack_pointer--];
}
}

public T peek()
{
return DataStack[stack_pointer];    
}}

最初にバックエンド ストレージとして配列を使用しました。実際に本格的に実装する前に、いくつか質問があります。

  1. throw new Exception を使用することをお勧めしますか、それともスタックのメモリが制限されている場合を考慮して、独自の例外クラスを作成する必要があります。

  2. 配列は実際にはスタックベースの実装に適していますか?私の使用シナリオでは、かなりのサイズの 10 個のオブジェクトを配列にプッシュするため、スタックのアイテムをポップしたらメモリを解放できるようにしたいと考えています。配列からのアイテム、私はよくグーグルしましたが、良いものを見つけることができませんでした.メモリからクリアしたいときは、この場所でリンクされたリストの方が良いでしょうか.

  3. ここでジェネリックを使用していますが、ジェネリックで配列を使用するのは悪い習慣ですか?

4

2 に答える 2

1

Exception1) 「メモリ制限」のために何も投げるべきではありません。より大きな配列を構築するだけです。ArrayList代わりに、これを行うまたは何かを使用することをお勧めします。JVM はメモリ不足のケースを処理します。自分で処理しようとしないでください。メモリ使用量に厳しい制限を課している場合 (たとえば、「スタックは初期容量と同じ大きさにすることができます」)、必要に応じて独自の例外を作成できますStackFullException。ただし、私のアドバイスStackは、にサイズ制限を設けるべきではないということです。

2) 配列 (またはArrayList) は問題ありません。AStackは後入れ先出しのデータ構造であるため、ArrayList または配列は完全に機能します。配列から最後の項目を取り出すだけです。Java には、C のようにメモリを「解放」するという同じ概念がなく、ガベージ コレクタがメモリの解放を処理します。オブジェクトの処理が終了したら、そのオブジェクトへの参照を削除するだけです。たとえば、配列を使用している場合array[lastIndex] = null;、操作を行ったら設定pop()し、残りはガベージ コレクターが処理します。

3) 型情報を具体的にするのは良い習慣です。

于 2013-04-30T06:23:23.690 に答える
0

例外自体よりも軽い例外をスローすることは常に良いことです.また、配列の使用に関しては、必要な要素の正確な数を持つことができ、メモリ使用量が少ないという利点もあるため、良いことです.申し訳ありませんが、わかりません遺伝子配列について。 これは役立つかもしれません

于 2013-04-30T06:27:31.850 に答える