성장일기

 해당 포스터에서 스택에 대한 개념은 정리하지 않는다.

 

 하지만 코테준비를 위해 스택을 직접 구현한 코드(배열, 리스트)와 라이브러리를 활용 한 스택 자료구조 사용방법에 대해 정리하려고 한다.

 

 코테에서는 스택을 직접 구현하는 것보단 스택을 활용한 응용문제들이 많이 나오는 것 같다.

 

1. 배열로 직접 구현


 배열로 직접 구현하는 경우는 배열의 크기가 정해진 상황에서는 쉽게 구현할 수 있지만, 크기가 정해지지 않는 상태에서는 배열은 실행 중 크기를 동적으로 바꿀 수 없기 때문에 각 상황에 맞게 배열을 다시 생성해서 값들을 옮겨주는 귀찮은 작업을 해야한다.(해당 코드에서는 이 작업이 적용되어있지 않다.)

public class Stack_Array {

    int top;
    int [] stack;
    int size;

    public Stack_Array(int size) {
        this.size = size; //
        stack = new int[size];
        top = -1; // top 의 값 초기화
    }

    private void push(int item) {
        stack[++top] = item;
        System.out.println(stack[top] + " push!");
    }

    private void peek() {
        System.out.println(stack[top] + " peek!");
    }

    private void pop() {
        System.out.println(stack[top] + " pop!");
        stack[top--] = 0;
    }

    private int search(int item) {
        for (int i = 0; i <= top; i++) { // for 문은 top 만큼
            if (stack[i] == item)
                return (top - i) + 1; // top - 탐색한 배열의 인덱스, 배열 이므로 +1 추가
        }
        return -1;
    }

    private boolean empty() {
        return size == 0;
    }
}

 

 

2. 리스트로 직접 구현


public class Stack_List {

    Node top;

    public Stack_List() {
        this.top = null;
    }

    private void push(int data) {
        Node node = new Node(data);
        node.linkNode(top);
        top = node;
    }

    public int peek() {
        return top.getData();
    }

    private void pop() {
        if (empty())
            throw new ArrayIndexOutOfBoundsException();
        else {
            top = top.getNextNode();
        }
    }

    private int search(int item) {
        Node searchNode = top;
        int index = 1;
        while(true) {
            if (searchNode.getData() == item) {
                return index;
            } else {
                searchNode = searchNode.getNextNode();
                index ++;
                if (searchNode == null)
                    break;
            }
        }

        return -1;
    }

    private boolean empty() {
        return top == null;
    }
}


class Node {

    private int data;
    private Node nextNode;

    public Node(int data) {
        this.data = data;
        this.nextNode = null;
    }

    protected void linkNode(Node node) {
        this.nextNode = node;
    }

    protected int getData() {
        return this.data;
    }

    protected Node getNextNode() {
        return this.nextNode;
    }
}

 

 

3. 스택 라이브러리의 사용


public class UseStack {

    public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();

        stack.push(1);     // stack에 1 추가
        stack.push(2);     // stack에 2 추가

        stack.pop();       // stack에 맨 위의 값 제거
        stack.clear();     // stack의 전체 값 제거 (초기화)

        stack.push(2);     // stack에 2 추가
        stack.push(4);     // stack에 4 추가
        stack.push(5);     // stack에 5 추가
        stack.peek();     // stack의 가장 상단의 값 출력 -> 5

        stack.contains(5); // stack에 5가 있는지 확인 -> false
        stack.size();      // stack의 크기 출력 : 2
        stack.empty();     // stack이 비어있는지 확인 (비어있다면 true)
    }
}

 

공유하기

facebook twitter kakaoTalk kakaostory naver band