작성일 2024.2.18
'쌓다'의 뜻을 가진 용어로, 접시를 쌓아 놓은 형태와 유사한 자료구조이다. 데이터를 한 방향으로 순서대로 쌓고, 꺼내는 구조이다. 가장 나중에 들어간 데이터를 가장 먼저 꺼낸다. (LIFO: Last In First Out)
후입선출(LIFO): 나중에 들어온 데이터가 가장 먼저 나가는 구조이다.
(Comparable인터페이스 또는 별도의 Comparator를 사용하여 지정이 가능하다.)
단방향 입출 구조: 데이터를 한 쪽 끝에서만 접근할 수 있다. 이 접근 포인트를 'Top'이라 한다.
빠른 작업 속도: 데이터의 추가와 제거가 상수 시간(O(1))에 이루어져, 스택은 빠른 작업 속도를 제공한다.
제한된 접근: 스택은 가장 최근에 추가된 데이터에만 접근이 가능하며, 중간에 있는 데이터는 입출력이 불가능하다.
Stack<Integer> stack = new Stack<>();
Stack 키워드로 선언한다.
stack.push(1);
stack.push(2);
stack.push(3);
stack.add(4); // 1234 <-이 방향으로 값이 쌓인다.
push() 또는 add()메서드를 이용해 값을 추가한다. 두 가지 메서드 모두 값을 추가할 수 있으나 push()를 사용하는 것이 스택의 의도에 더 부합하다.
push() : 스택의 맨 위에 요소를 추가한다.
add(): 컬렉션에 요소를 추가한다.
int value = stack.pop();
System.out.println("value = " + value); // value = 4 (4제거,현재 123)
-pop(): 가장 최근에 추가된 데이터가 제거된다.
int peekVal = stack.peek();
System.out.println("peekVal = " + peekVal); // peekVal = 3
peek(): 스택의 맨 위에 위치한 데이터를 가져오며 데이터를 제거하지 않는다.
boolean isEmpty = stack.isEmpty();
System.out.println("isEmpty = " + isEmpty); // isEmpty = false
isEmpty(): 스택이 비어있는지에 따라 true, false를 반환한다.
int size = stack.size();
System.out.println("size = " + size); //size = 3
size(): 스택의 사이즈
// 현재 스택에 123 존재
System.out.println("stack.search(0) = " + stack.search(0)); // stack.search(0) = -1 (존재X)
System.out.println("stack.search(2) = " + stack.search(2)); // stack.search(2) = 2
System.out.println("stack.search(3) = " + stack.search(3)); // stack.search(3) = 1
스택의 끝에서부터 카운트하여. 가장 마지막에 넣은 값이 첫번째 값으로 1이다.
해당 값이 스택에 존재하지 않다면 -1을 반환한다.
boolean isContain = stack.contains(3);
System.out.println("isContain = " + isContain); // isContain = true
Reference