Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags more
Archives
Today
Total
관리 메뉴

luke

[자바/Java] - Stack(스택) 정리 및 활용 본문

Study/Java

[자바/Java] - Stack(스택) 정리 및 활용

luke-king 2024. 4. 29. 16:54

 

 

 

 

 

Stack(스택) 정리 및 활용

전에 스택 구조에 대해 설명한 적이 있지만 부족한 점이 많아

이번에는 스택 구조에 대해 조금더 자세히 정리하고 활용하는 방법을 적어보려고 한다.

 

 

스택이란?

스택은 '쌓다.' 의 의미로 남자들이라면 게임하면서 캐릭터가 스킬 사용을 하기 위해 스택을 쌓는 경험을 해본 적이 있을 것이다. 즉, 데이터를 순서대로 쌓는 자료구조다. 

 

스택은 가장 나중에 들어온 데이터가 가장 먼저 빠져나가는 후입선출(LIFO, Last In First Out) 구조로 되어 있다. 프로그래밍에서 데이터가 입력된 순서대로 처리되는 것이 아닌, 가장 나중에 들어온 데이터를 먼저 처리할 때 사용한다.

 

 

특징

  • 후입선출(LIFO) 구조 : 먼저 들어온 데이터가 나중에 빠져나가는 구조
  • 단방향 입출력 구조 : 데이터의 들어오는 방향과 나가는 방향이 같다.
  • 데이터를 하나씩만 넣고 뺄 수 있다.  

 

 

 

스택 선언

스택의 선언은 Stack<T> 변수명 = new Stack<>(); 로 선언한다.

import java.util.*;

public class Main {
    public static void main(String[] args) {

        //Integer형 Stack
        Stack<Integer> IntegerStack = new Stack<>();
        //String형 Stack
        Stack<String> StringStack = new Stack<>();
        //Boolean형 Stack
        Stack<Boolean> booleanStack = new Stack<>();


    }

}

스택 선언은 위와 같이 Integer형, String형 Boolean형으로 총 3가지 타입으로 선언이 가능하다.

 

 

 

add(), push() (스택에 값 추가)

스택에 값 추가하는 함수는 add(), push() 이렇게 두 가지의 함수로 이루어져 있다.

  • 공통점 : add,push 는 값을 추가하는 데 사용한다.
  • 다른 점 : add는 반환값이 true / false이고 push 반환값은 집어넣은 값이 리턴된다.
import java.util.*;

public class Main {
    public static void main(String[] args) {

        //Integer 형 Stack
        Stack<Integer> integerStack = new Stack<>();

        integerStack.add(1);
        integerStack.add(2);
        integerStack.add(3);

        integerStack.push(1);
        integerStack.push(2);
        integerStack.push(3);

        //반환 값을 true/false로 반환 
        System.out.println(integerStack.add(1));
        System.out.println(integerStack.push(6));

        System.out.println(integerStack);
    }

}

 

<실행 결과>

true
6
[1, 2, 3, 1, 2, 3, 6, 6]

 

위 실행 결과를 보면 integerStack 변수에 스택이 쌓인 걸 확인할 수 있다.

다만 위에 말했다시피 add는 true / false를 반환하기에 출력으로 확인해 보면 값이 아닌 true가 반환된다.

하지만 push 같은 경우 add와 다르게 6을 반환하는 걸 확인할 수 있다.

 

 

peak() (스택의 마지막 요소)

peak() 함수는 스택에 있는 값들 중 마지막으로 쌓인 요소를 반환한다. 즉, 스택에 먼저 사용될 요소를 반환하는 것이다.

하지만 스택이 비어있다면 예외가 발생한다.

import java.util.*;

public class Main {
    public static void main(String[] args) {

        //Integer 형 Stack
        Stack<Integer> integerStack = new Stack<>();

        integerStack.add(1);
        integerStack.add(2);
        integerStack.add(3);

        integerStack.push(1);
        integerStack.push(2);
        integerStack.push(10);

        System.out.println(integerStack);
        System.out.println(integerStack.peek());
    }

}

 

 

<실행 결과>

[1, 2, 3, 1, 2, 10]
10

 

실행 결과를 보면 마지막 push()에 10이 들어간 걸 확인할 수 있으며 후입선출(LIFO)이란 말과 같이 마지막 요소를 반환 하는걸 확인할수 있다. 

 

 

pop() (스택의 마지막 요소 제거)

pop() 함수는 peak() 함수와 같은 스택의 마지막 요소를 반환한다.

하지만 pop()은 peak()과 다르게 값을 반환한 뒤 스택 내에서 제거된다.

import java.util.*;

public class Main {
    public static void main(String[] args) {

        //Integer 형 Stack
        Stack<Integer> integerStack = new Stack<>();

        integerStack.add(1);
        integerStack.add(2);
        integerStack.add(3);

        integerStack.push(1);
        integerStack.push(2);
        integerStack.push(10);

        System.out.println(integerStack.peek());
        System.out.println(integerStack);
        
        System.out.println(integerStack.pop());
        System.out.println(integerStack);
    }

}

 

 

<실행 결과>

10
[1, 2, 3, 1, 2, 10]
10
[1, 2, 3, 1, 2]

 

실행 결과를 보면 바로 이해하기 쉽다. 처음 peak() 함수를 사용했을 때 보면 stack에는 그대로 값이 남아있는 걸 확인할 수 있다. pop() 함수를 사용했을 때를 보자 peak()과 같이 10을 반환하지만 stack전체 값을 조회해 보면 10이 제거된 걸 볼 수 있다.

 

 

 

empty(), clear(), contain()

  • empty() : 스택이 비었는지 확인
  • clear() : 스택의 모든 값 삭제
  • contain() : 특정 값을 가지고 있는지 확인 (반환은 true / false)
import java.util.*;

public class Main {
    public static void main(String[] args) {

        //Integer 형 Stack
        Stack<Integer> integerStack = new Stack<>();
        Stack<Integer> emptyStack = new Stack<>();

        integerStack.add(1);
        integerStack.add(2);
        integerStack.add(3);

        integerStack.push(1);
        integerStack.push(2);
        integerStack.push(10);

        System.out.println(integerStack.empty()); // 스택에 값들이 있는 스택
        System.out.println(emptyStack.empty());   // 스택에 값들이 없는 스택

        System.out.println(integerStack.contains(99)); // 스택 내에 99는 없으므로 false
        System.out.println(integerStack.contains(3));  // 스택 내에 3이 있으므로 true

        integerStack.clear();
        System.out.println(integerStack);

    }

}

 

 

<실행 결과>

false
true
false
true
[]

 

실행 결과를 확인해 보자 (추가로 emptyStack을 만들어 줬다.)

  • empty() : 기존에 있던 integerStack은 값들이 있으므로 false를 반환한다. 새로 만들어준 emptyStacker는 값을 추가한 게 없기에 빈 스택이므로 true를 반환했다.
  • contain() : 99는 스택 내에 없는 값이므로 false, 3은 있는 값이므로 true를 반환했다.
  • clear() : clear() 함수를 쓴 뒤 출력했을 때 스택의 값은 다 삭제되므로 빈 스택인걸 확인할 수 있다.

 

이렇게 Stack에 대해 조금 더 자세히 정리해보고 활용하는 방법을 남겨봤다.

비전공자로써 조금더 기본기가 탄탄해야겠다 생각이 한 번 더 들고 요즘 개발 시장이 어렵다는 이야기가 많이 나오는데 나 또한 포기하지 않고 해야겠다. 모든 개발자 취준생 분들 파이팅입니다!!!!