Stack 스택

스택은 데이터를 저장하고 사용하는 여러 자료구조 중 하나의 방법이다. 스택은 책을 엎어서 쌓아놓은 구조라고 생각하면 이해하기 편하다. 책을 제일 위에 차곡 차곡 쌓다보면 후에 책을 찾을 때, 제일 위에 있는 책을 꺼내야만 한다.



스택의 값 삽입 [Push]

스택의 값 삽입 파란색 상자는 스택을 나타내고, 보라색 상자는 삽입을 하려는 데이터이다. 데이터는 스택의 가장 상단부터 차곡 차곡 쌓이게 된다. 값을 삽입하는 것을 push라고 한다.

스택의 값 추출

스택의 값 추출 스택에서 값을 추출하게 되면 상단의 데이터부터 차례대로 추출된다. 값을 추출하는 것을 pop이라고 한다.




예제 코드

Stack.java

public interface Stack {
  public boolean isEmpty();
  public boolean full();
  public void push(Object item);
  public Object pop();
  public Object peek();
}

스택의 기본 동작을 정의한 interface.

  • isEmpty() : 스택이 비어있는지 확인하는 메소드
  • full() : 스택이 꽉찼는지 확인하는 메소드
  • push() : 스택에 Object item을 저장하는 메소드
  • pop() : 스택에서 값을 pop한다. pop한 값을 리턴한다.
  • peek() : 스택 상단의 값을 리턴한다. 하지만 pop은 아니기 때문에 스택 상단의 값은 변하지 않는다.

ArrayStack.java

public class ArrayStack implements Stack{
  // stack 상단을 가르키는 변수
  private int top;
  // stack 의 크기
  private int maxSize;
  // 데이터를 저장하는 스택
  private Object stackArray[];


  public ArrayStack(int maxSize) {
    this.maxSize = maxSize;
    this.stackArray = new Object[this.maxSize];
    this.top = -1;	// no element
  }

  public boolean isEmpty() {
    // if this.top is -1, stack has no element
    return ( this.top == -1 );
  }

  public boolean full() {
    // check the stack is full
    return ( this.top == this.maxSize-1 );
  }

  public void push(Object item) {
    // insert to stack
    if(full()) {
      System.out.println("Stack is Full.");
      return ;
    }

    // insert object to stack
    top ++;
    stackArray[top] = item;

  }

  public Object pop() {
    Object item = peek();
    if(!isEmpty()) top --;
    return item;		
  }

  public Object peek() {
    if(isEmpty()) {
      System.out.println("Stack is Empty");
      return null;
    }else {
      Object item = stackArray[top];
      return item;
    }
  }
}

Main.java

public class mainClass {

  public static void main(String[] args) {
    // TODO Auto-generated method stub
    ArrayStack stack = new ArrayStack(10);


    if(stack.isEmpty()) {

      String str = new String("hello world");
      stack.push(str);
      System.out.println(stack.peek());

      String str1 = new String("hello world1");
      stack.push(str1);
      System.out.println(stack.peek());

      String str2 = new String("hello world2");
      stack.push(str2);
      System.out.println(stack.peek());

      String str3 = new String("hello world3");
      stack.push(str3);
      System.out.println(stack.peek());


      // delete element
      System.out.println(stack.pop());
      System.out.println(stack.peek());


      Integer i = new Integer(100);
      stack.push(i);
      System.out.println(stack.peek());

      Integer i1 = new Integer(200);
      stack.push(i1);
      System.out.println(stack.peek());

      Integer i2 = new Integer(300);
      stack.push(i2);
      System.out.println(stack.peek());

      Integer i3 = new Integer(400);
      stack.push(i3);
      System.out.println(stack.peek());

    }
  }

Comments