스택은 가장 늦게 들어온 데이터가 가장 먼저 빠져나가는 후입선출(LIFO : Last In First Out) 구조이다. 데이터의 출입 방향이 같은 단방향 입출력 구조이며 데이터를 하나씩 넣고 뺄 수 있다.
깊이 우선 탐색 (Depth First Search: DFS)에 이용되며 재귀 함수의 동작 흐름과 같은 구조를 가진다.
(참고 : 너비 우선 탐색 (Breadth First Search: BFS)는 자료구조로 Queue 를 사용한다.)
그러나 요즘에는 스택(Stack)보다는 Deque(덱)이 더 많이 쓰임.
Deque(덱) 정리는 여기에 -> https://velog.io/@seha01130/JAVA-덱Deque-정리
Stack<Integer> stackInt = new Stack<>();
Stack<String> stackStr = new Stack<>();
스택은 push()를 호출하여 값을 하나씩 추가한다.
push()는 요소를 스택 맨 위에 추가하고 그 추가된 요소 자체를 반환.
pop()을 호출하여 하나씩 제거할 수 있으며 제거한 해당 값을 반환함.
전체 제거는 clear()를 호출한다.
Stack<Integer> stack = new Stack<>();
int pushed = stack.push(1);
System.out.println("pushed Item : " + pushed);
stack.push(2);
stack.push(3);
stack.push(4);
System.out.println(stack);
int removed = stack.pop();
System.out.println("removed Item : " + removed);
int removed2 = stack.pop();
System.out.println("removed Item : " + removed2);
System.out.println(stack);
stack.clear();
System.out.println(stack);
-----결과-----
pushed Item : 1
[1, 2, 3, 4]
removed Item : 4
removed Item : 3
[1, 2]
[]
peek() 함수는 가장 최근에 넣은 값(맨 위 요소)을 제거하지 않고 그냥 확인만 할 때 사용하는 메서드
Stack<Integer> stack = new Stack<>();
stack.push(10);
stack.push(20);
System.out.println("Top item is: " + stack.peek());
System.out.println("Stack size is: " + stack.size());
-----결과-----
Top item is: 20
Stack size is: 2
empty()는 스택이 비어 있는지 확인하는 메서드이며 비어 있으면 true, 요소가 하나라도 있으면 false를 반환한다. isEmpty()와 사실상 같지만, Stack 전용 느낌으로 만들어져 있음.
Stack<Integer> stack = new Stack<>();
System.out.println(stack.empty()); // true
stack.push(100);
System.out.println(stack.empty()); // false
search() : 스택 안에서 해당 객체가 몇 번째 위치에 있는지를 알려준다.
스택의 top(맨 위)을 1번 위치로 봐서, 그 기준으로 몇 번째인지 반환하고, 없으면 -1 반환. (LIFO 성격과 잘 맞지 않는 탐색 동작이라 잘 쓰이진 않음)
stack은 vector를 상속하므로
size(), get(int index), set(int index, E element), remove(int index), clear(), contains(Object o), isEmpty() 메소드 또한 사용 가능하다.
그러나 잘 쓰이지 않음.