자료구조

2. 스택 stack

늦깍이 2022. 9. 6. 10:29
  • Stack이란?
    LIFO(Last In, First Out) 
    후입, 선출 / 먼저 들어간게 먼저 나온다.
    리스트의 제한된 형태 넣고 빼기가 리스트의 한쪽 끝에서만 가능하다.(뒤에서만 넣고 빼기가 가능한 리스트)
    PUSH(넣기) POP(빼기) TOP(맨 위의 값 리턴)

  • Stack ADT
public interface Stack<E> {
    public void clear(); // 전부 다 지우기
    
    public void push(E it); // 값을 맨 위에 넣기
    
    public E pop(); // 맨 위의 값을 빼서 쓰기 (return타입이 있는 이유)
    
    public E topValue(); // 맨 위의 값을 가져만 오기 (return타입이 있는 이유)
    
    public int length(); // 스택에 얼마나 많은 아이템이 들어가있는지를 리턴
}
  • ADT의 구현 방법 ( Array, Link )
//Array의 경우
public class AStack<E> implements Stack<E> {

    public int maxSize;
    public int top;
    public E[] listArray;

    public AStack(int capacity) {
        maxSize = capacity;
        listArray = (E[]) new Object[capacity];
        top = -1;
    }

    @Override
    public void clear() {
        top = -1;
    }

    @Override
    public E top() {
        if (top == -1) {
            return null;
        } else {
            return listArray[top];
        }
        return null;
    }

    @Override
    public E pop() {
        if (top == -1) {
            return null;
        } else {
            // E ret = listArray[top];
            // top--;
            // return ret;
            return listArray[top--];
        }
    }

    @Override
    public void push(E it) {
        top++;
        listArray[top] = it;
    }

    @Override
    public int length() {
        return top + 1;
    }

}
//Linked List의 경우
class Link<E> {
    public E item;
    public Link<E> next;

    public Link(E item, Link<E> next) {
        this.item = item;
        this.next = next;
    }
}

public class LStack<E> implements Stack<E> {

    Link<E> head;
    int size;

    public LStack() {
        head = new Link<E>(null, null);
        size = 0;
    }

    @Override
    public void clear() {
        head.next = null;
        size = 0;
    }

    @Override
    public E top() {
        if (head.next == null)
            return null;
        else
            return head.next.item;
    }

    @Override
    public E pop() {
        if (head.next == null)
            return null;
        else {
            E ret = head.next.item;
            head.next = head.next.next;
            size--;
            return ret;
        }
    }

    @Override
    public void push(E it) {
        head.next = new Link(it, head.next);
        size++;
    }

    @Override
    public int length() {
        return size;
    }

}

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

4. 트리 Tree  (0) 2022.09.18
3. 큐 Queues  (0) 2022.09.13
1. 리스트(3) List Iterator, DLink  (0) 2022.09.05
1. 리스트(2) Linked list  (0) 2022.09.04
1. 리스트(1) Array Lists  (0) 2022.09.04