2017-02-15 2 views
1

配列内に2つのスタックを実装するサンプルコードを見ています。私が理解していない部分が初期設定にあります。なぜtop1を0ではなく-1として初期化するのですか?なぜsize2の代わりにsize2のtop2?ここ0のような他の数字の代わりに、コンストラクタ-1の初期化がなぜですか?配列内に2つのスタックを実装する

コードである:

public class StackArray { 
    int size; 
    int top1, top2; 
    int arr[]; 

    public StackArray(int n){ 
     size = n; 
     arr = new int[n]; 
     top1 = -1; 
     top2 = size; 
    } 
    public void push1(int x){ 
     if(top1<top2-1){ 
     top1++; 
     arr[top1] = x; 

     } 

     else{ 
      System.out.println("There is a stack overflow "); 
     } 
    } 

    public void push2(int x){ 
     if (top1<top2-1){ 
      top2--; 
      arr[top2] = x; 


     } 
     else{ 
      System.out.println("There is a stackoverflow"); 
     } 
    } 

    public int pop1(){ 
     if(top1>=0){ 
      int x = arr[top1]; 
      top1--; 
      return x; 
     } 
     else{ 
      System.out.println(size); 
      System.out.println("There is a stack underflow"); 
     } 
     return -1; 
    } 

    public int pop2(){ 
     if (top2<size){ 
      int x = arr[top2]; 
      top2++; 
      return x; 
     } 
     else{ 
      System.out.println("There is a stack underflow"); 
     } 
     return -1; 
    } 



} 
+1

テストを作成します。数字を変更してどのような動作が変化するかを確認します。 –

+0

私の提案は、値を '0'に変更し、それをデバッグして何が起こるのかを確認することです。 –

+0

ところで、' toString() 'メソッドはあなたが意図することをほぼ確実にしません。 –

答えて

1

このクラスは、配列の両端に要素を押すことによって実装2つのスタックを実装するように見えます。

コンストラクタが呼び出されると、スタックは空になるので、2つのスタックの先頭が配列の有効範囲外のインデックスを指し示すのは理にかなっています。一方の端は-1、配列の長さはarr.length )。

最初の要素を最初のスタック(push1)にプッシュすると、top1が0にインクリメントされ、要素inが配列の最初のインデックスに追加されます。

最初の要素を2番目のスタック(push2)にプッシュすると、top2arr.length - 1にデクリメントされ、その要素が配列の最後のインデックスに追加されます。例えば

、配列の長さはちょうどアレイの外側の位置に第一、スタックが空である、head1head2時点で7

であると仮定する:

------------------------------------ 
    | | | | | | | | 
    ------------------------------------ 
-1 0 1 2 3 4 5 6  7 
head1         head2 

push1(5)を呼び出すとき、head1インクリメント:

------------------------------------ 
    | 5 | | | | | | | 
    ------------------------------------ 
-1 0 1 2 3 4 5 6  7 
    head1        head2 

push2(34)head2がデクリメントされます。

------------------------------------ 
    | 5 | | | | | | 34 | 
    ------------------------------------ 
-1 0 1 2 3 4 5 6  7 
    head1       head2 
0

0size-1がスタックの有効インデックス値であるため、理由があります。 スタックが空に初期化されているため、開始インデックスと終了インデックスの値はの範囲外でに初期化されます。

このように、スタックの先頭に最初のプッシュインデックス0(アレイの実際の開始)とスタックの端部に第一のプッシュにtop1を取るインデックスsize-1(実際の末尾にtop2を取り配列)

0
public class StackArray { 

    int size; 

    int top1, top2; 

    int arr[]; 

    public MainJava(int n) { 
     size = n; 
     arr = new int[n]; 
     top1 = -1; 
     top2 = size; 
    } 

    public void push1(int x) { 
     if (top1 < top2 - 1) { 
      top1++; 
      arr[top1] = x; 

     } 

     else { 
      System.out.println("There is a stack1 overflow "); 
     } 
    } 

    public void push2(int x) { 
     if (top1 < top2 - 1) { 
      top2--; 
      arr[top2] = x; 

     } else { 
      System.out.println("There is a stack2 overflow"); 
     } 
    } 

    public int pop1() { 
     if (top1 >= 0) { 
      int x = arr[top1]; 
      arr[top1] = 0; 
      top1--; 
      return x; 
     } else { 
      System.out.println(size); 
      System.out.println("There is a stack1 underflow"); 
     } 
     return -1; 
    } 

    public int pop2() { 
     if (top2 < size) { 
      int x = arr[top2]; 
      arr[top2] = 0; 
      top2++; 
      return x; 
     } else { 
      System.out.println("There is a stack2 underflow"); 
     } 
     return -1; 
    } 

    public String toString() { 
     StringBuilder result = new StringBuilder("The array is : "); 
     for (int i = 0; i < arr.length; i++) { 
      result.append(arr[i] + "\t"); 
     } 
     return result.toString(); 
    } 

} 

-1を維持する理由は、すべてのレコードを1つずつポップしてスタックアンダーフローをキャッチする-1がクリーンなオプションです。配列インデックスは0から始まります。 また、スタック2にアイテムがプッシュされずにポップしようとすると、top2はサイズとして保持され(サイズ-1ではなく)保持されます。それは正しく動作するはずです。

したがって、基本的には、最悪の場合のシナリオを考慮してその値に維持されます。

レコードを正しく印刷するようにtoStringを変更しました。

乾杯!

関連する問題