IntStack 클래스

2025. 4. 19. 23:13자료구조

스택이란?

  • 동일한 자료형의 집합을 의미
  • 스택은 맨 위에 데이터를 추가하고 제거 가능한 자료구조이다. (LIFO, last in first out)

코드 설명

/******************************************************************************/
// IntStack 클래스는 정수형 스택 구조를 제공합니다.
public class IntStack implements Cloneable
{
   // IntStack 클래스의 불변 조건:
   //   1. 스택에 들어 있는 항목의 수는 manyItems 변수에 저장됩니다.
   //   2. 스택이 비어 있으면 data 배열에 어떤 값이 들어 있는지는 중요하지 않습니다.
   //      스택이 비어 있지 않다면, data 배열에 항목이 저장되며,
   //      스택의 바닥은 data[0], 그 다음 항목은 data[1], ... 맨 위 항목은 data[manyItems-1]입니다.
   private int[ ] data;
   private int manyItems; 


   /**
   * 초기 용량이 10인 비어 있는 스택을 생성합니다.
   * @param 없음
   * @postcondition
   *   이 스택은 비어 있으며 초기 용량은 10입니다.
   * @exception OutOfMemoryError
   *   <CODE>new int[10]</CODE> 생성 시 메모리가 부족한 경우 발생합니다.
   **/   
   public IntStack( )
   {
      final int INITIAL_CAPACITY = 10;
      manyItems = 0;
      data = new int[INITIAL_CAPACITY];
   }

   
   /**
   * 지정된 초기 용량을 가진 비어 있는 스택을 생성합니다.
   * @param initialCapacity
   *   스택의 초기 용량
   * @precondition
   *   initialCapacity는 0 이상이어야 합니다.
   * @postcondition
   *   이 스택은 비어 있으며 주어진 용량을 가집니다.
   * @exception IllegalArgumentException
   *   initialCapacity가 음수일 경우 발생합니다.
   * @exception OutOfMemoryError
   *   <CODE>new int[initialCapacity]</CODE> 생성 시 메모리가 부족한 경우 발생합니다.
   **/   
   public IntStack(int initialCapacity)
   {
      if (initialCapacity < 0)
         throw new IllegalArgumentException("초기 용량이 너무 작습니다: " + initialCapacity);
      manyItems = 0;
      data = new int[initialCapacity];
   }

   
   /**
   * 이 스택의 복사본을 생성합니다.
   * @return
   *   이 스택의 복사본을 반환합니다. 원본과 복사본은 서로 영향을 주지 않습니다.
   * @exception OutOfMemoryError
   *   복사본 생성 중 메모리 부족 시 발생합니다.
   **/ 
   public Object clone( )       
   {
      IntStack answer;
      
      try
      {
         answer = (IntStack) super.clone( );
      }
      catch (CloneNotSupportedException e)
      {
         throw new RuntimeException("이 클래스는 Cloneable을 구현하지 않았습니다.");
     }
      
      answer.data = (int [ ]) data.clone( );
      return answer;
   }        
 

   /**
   * 이 스택의 현재 용량을 지정된 값 이상으로 늘립니다.
   * @param minimumCapacity
   *   최소 확보해야 하는 용량
   * @postcondition
   *   이 스택의 용량은 최소한 minimumCapacity 이상이 됩니다.
   * @exception OutOfMemoryError
   *   용량을 늘리기 위한 메모리 부족 시 발생합니다.
   **/
   public void ensureCapacity(int minimumCapacity)
   {
      int biggerArray[ ];
      
      if (data.length < minimumCapacity)
      {
         biggerArray = new int[minimumCapacity];
         System.arraycopy(data, 0, biggerArray, 0, manyItems);
         data = biggerArray;
      }
   }


   /**
   * 이 스택의 현재 용량을 반환합니다.
   * @return
   *   스택의 현재 용량
   **/
   public int getCapacity( )   
   {
      return data.length;
   }

   
   /**
   * 이 스택이 비어 있는지 확인합니다.
   * @return
   *   스택이 비어 있으면 true, 아니면 false
   **/
   public boolean isEmpty( )
   {
      return (manyItems == 0);
   }
   

   /**
   * 스택의 맨 위 항목을 제거하지 않고 확인합니다.
   * @precondition
   *   스택이 비어 있지 않아야 합니다.
   * @return
   *   스택의 맨 위 항목
   * @exception EmptyStackException
   *   스택이 비어 있을 경우 발생합니다.
   **/   
   public int peek( )   
   {
      if (manyItems == 0)
         throw new EmptyStackException( );
      return data[manyItems-1];
   }

   
   /**
   * 스택의 맨 위 항목을 꺼내어 제거합니다.
   * @precondition
   *   스택이 비어 있지 않아야 합니다.
   * @postcondition
   *   맨 위 항목이 제거되며 반환됩니다.
   * @exception EmptyStackException
   *   스택이 비어 있을 경우 발생합니다.
   **/    
   public int pop( )
   {
      if (manyItems == 0)
         throw new EmptyStackException( );
      return data[--manyItems];
   }
   
 
   /**
   * 새 항목을 스택에 추가합니다.
   * 용량을 초과하면 자동으로 용량이 늘어납니다.
   * @param item
   *   추가할 항목
   * @postcondition
   *   항목이 스택에 추가됩니다.
   * @exception OutOfMemoryError
   *   용량 증가를 위한 메모리 부족 시 발생합니다.
   * @note
   *   용량이 Integer.MAX_VALUE를 초과하면 스택이 실패할 수 있습니다.
   **/    
   public void push(int item)
   {
      if (manyItems == data.length)
         ensureCapacity(manyItems*2 + 1);
      data[manyItems++] = item;
   }
              

   /**
   * 이 스택에 들어 있는 항목 수를 반환합니다.
   * @return
   *   항목 수
   **/ 
   public int size( )   
   {
      return manyItems;
   }


   /**
   * 이 스택의 용량을 현재 크기만큼으로 줄입니다.
   * @postcondition
   *   스택의 용량이 현재 항목 수에 맞게 조정됩니다.
   * @exception OutOfMemoryError
   *   용량 변경을 위한 메모리 부족 시 발생합니다.
   **/   
   public void trimToSize( )
   {
      int trimmedArray[ ];
      
      if (data.length != manyItems)
      {
         trimmedArray = new int[manyItems];
         System.arraycopy(data, 0, trimmedArray, 0, manyItems);
         data = trimmedArray;
      }
   } 
}
  • LIFO의 구조를 나타낸 Int형의 stack구조이다.

필드 변수

private int[] data;
private int manyItems;
  • data에는 int자료형의 데이터를 저장해 준다.
  • manyItems는 데이터의 개수를 저장해 준다.

생성자

public IntStack() {
   final int INITIAL_CAPACITY = 10;
   manyItems = 0;
   data = new int[INITIAL_CAPACITY];
}
  • 기본 생성자는 초기 용량을 10으로 고정하여서 비어있는 스택을 생성한다.
  • data 배열을 new int [10]으로 선언해 준다.
public IntStack(int initialCapacity)
  • 이번 생성자는 초기 용량을 initialCapacity로 선언해 준다.
  • 음수 용량을 받은 경우에는 IllegalArgumentException을 발생시킨다.

메서드

public Object clone( )       
   {
      IntStack answer;
      
      try
      {
         answer = (IntStack) super.clone( );
      }
      catch (CloneNotSupportedException e)
      {
         throw new RuntimeException("이 클래스는 Cloneable을 구현하지 않았습니다.");
     }
      
      answer.data = (int [ ]) data.clone( );
      return answer;
   }
  • answer에 super.clone() 활용하여서 얕은 복사를 해준다.
  • 그런 다음 (int [ ])data.clone()으로 깊은 복사를 진행해 준다.
public void trimToSize( )
   {
      int trimmedArray[ ];
      
      if (data.length != manyItems)
      {
         trimmedArray = new int[manyItems];
         System.arraycopy(data, 0, trimmedArray, 0, manyItems);
         data = trimmedArray;
      }
   }
  • 배열의 용량을 데이터의 개수에 맞춰서 줄여주는 메서드.
  • arraycopy를 활용하여서 용량에 알맞게 저장해 준다.
 public int getCapacity( )   
   {
      return data.length;
   }
  • 배열의 크기를 return 해준다. (data.length)
public boolean isEmpty( )
   {
      return (manyItems == 0);
   }
  • 데이터의 개수가 0이라면 true, 아니라면 false를 리턴해준다.
 public int size( )   
   {
      return manyItems;
   }
  • 데이터의 개수를 리턴해준다. (manyItems)
 public void push(int item)
   {
      if (manyItems == data.length)
         ensureCapacity(manyItems*2 + 1);
      data[manyItems++] = item;
   }
  • 만약 현제 데이터의 개수가 데이터의 용량과 동일하여서 데이터를 넣을 수 없다면 현제 데이터 개수의 2배만큼 용량을 늘려준다.
  • manyItems의 위치에 item을 저장해 주고 manyItems를 1 증가시켜준다.
  public int pop( )
   {
      if (manyItems == 0)
         throw new EmptyStackException( );
      return data[--manyItems];
   }
  • 만약 데이터의 개수가 0이라면 EmptyStackException을 발생시킨다.
  • --manyItems위치의 데이터를 리턴해준다.
public void ensureCapacity(int minimumCapacity)
   {
      int biggerArray[ ];
      
      if (data.length < minimumCapacity)
      {
         biggerArray = new int[minimumCapacity];
         System.arraycopy(data, 0, biggerArray, 0, manyItems);
         data = biggerArray;
      }
   }
  • 만약 minmumCapacity가 data의 용량보다 작은 경우에 배열의 용량을 늘려준다.
  • arraycopy를 활용하여서 데이터의 용량을 늘려준다.

'자료구조' 카테고리의 다른 글

IntLinkedStack 클래스  (0) 2025.04.20
스택 활용하기  (0) 2025.04.20
IntNode 클래스  (0) 2025.04.19
IntLinkedBag 클래스  (0) 2025.04.18
IntArrayBag 클래스  (0) 2025.04.18