개발공부/Java

[Java] Stack 구현해보기

코푸딩 2023. 4. 11. 16:18
728x90

1. 소개

정수 배열을 이용해 Stack을 구현해보았다.

기본 크기는 1이며 스택의 크기를 초기화할 수 있도록 생성자를 만들었다.

주요 메서드인 push, pop, pick 메서드와 스택의 크기를 구하는 size를 구현했다

 

2. 생성자

 

멤버 변수로는 다음 데이터의 위치(index)를 나타내는 top과 정수 배열인 stack이 있다.

//MyStack의 멤버 변수
int top;
int[] stack;

 

기본 크기는 1이며, 크기는 초기화 가능하게 만들었다.

public MyStack() {
        top = 0;
        stack = new int[1];
    }

    public MyStack(int size) {
        top = 0;
        stack = new int[size];
    }

 

3. PUSH()

새로운 데이터를 추가하는 push 메서드다.

데이터의 위치는 top이며 데이터를 추가할 때마다 위치가 증가한다.

정수 배열을 사용하기 때문에 데이터의 수가 배열보다 커지면 기존 배열보다 크기가 1만큼 큰 배열을 새로 만든다.

그리고 data를 저장한 뒤 top의 위치를 이동한다.

 

이때 배열에 데이터가 가득 찼는지 확인하는 isFull 메서드를 만들어 이용한다.

public void push(int data) {
    if(isFull()){
        stack = Arrays.copyOf(stack, stack.length + 1);
    }
    stack[top] = data;
    top++;
}
    
    
    
private boolean isFull(){
    if(top >= stack.length){
        return true;
    } else {
        return false;
    }
}

 

 

4. PEEK()

peek 메서드는 가장 마지막에 삽입된 데이터를 확인하는 메서드다.

만약 배열이 비어있다면 예외를 발생시키며 배열이 비어있는지 확인하기 위한 isEmpty 메서드를 만들었다..

 

    public int peek(){
        if(isEmpty()){
            throw new IllegalArgumentException("stack is empty");
        }
        return stack[top-1];
    }

    private boolean isEmpty(){
        if(top == 0){
            return true;
        }
        return false;
    }

 

 

5. POP()

pop 메서드는 마지막 데이터를 반환한 뒤 stack에서 해당 데이터를 삭제하는 메서드다.

데이터 반환에는 기존의 peek 메서드를 이용한다.

데이터 반환 뒤 해당 데이터를 배열에서 삭제하고 top의 위치를 감소시킨다.

정수 배열의 초기값은 0이므로 데이터 삭제 = 0 으로 생각해 만들었다.

    public int pop(){
        int obj = peek();
        stack[--top] = 0;
        return obj;
    }

 

 

6.SIZE()

size는  현재 stack의 크기를 반환하는 메서드다.

push 메서드로 stack의 크기가 유연하게 변하는지 테스트하기 위해 만들었다.

    public int size(){
        return stack.length;
    }

 

 

7. 테스트

구현한 stack이 잘 작동되는지 확인해봤다.

push 메서드로 데이터를 삽입하면서 stack의 크기가 변하는지 출력해보았다.

public static void main(String[] args) {
        MyStack stack = new MyStack(3);
        stack.push(1);
        stack.push(2);
        stack.push(3);
        System.out.println(stack.size());
        stack.push(4);
        System.out.println(stack.size());
        stack.push(5);
        System.out.println(stack.size());
    }

위 테스트 결과 콘솔창

 

728x90