[Java] 자바 스택(Stack) 클래스 메서드 정리 및 활용
스택이란?
스택은 ‘쌓다.’, ‘쌓이다.’와 같은 뜻을 가진 용어로, 접시를 높이 쌓아 놓은 형태와 비슷한 자료구조이다. 즉, 데이터를 순서대로 쌓는 자료구조이다.
실생활에서 흔히 접할 수 있는 스택은 프링글스와 같은 원통에 들어가 있는 과자를 떠올리면 이해하기 쉽다. 가장 위에 있는(가장 나중에 들어간) 과자를 먼저 꺼내어 먹는 구조이기 때문이다.
스택은 가장 나중에 들어온 데이터가 가장 먼저 빠져나가는 후입선출(LIFO : Last In First Out) 구조로 되어 있어, 프로그래밍에서 데이터가 입력된 순서대로 처리되는 것이 아닌, 가장 나중에 들어온 데이터를 먼저 처리할 때 사용한다.
스택의 특징
- 후입선출 (LIFO : Last In First Out) 구조 : 먼저 들어온 데이터가 나중에 빠져나가는 구조
- 단방향 입출력 구조 : 데이터의 들어오는 방향과 나가는 방향이 같다.
- 데이터를 하나씩만 넣고 뺄 수 있다.
- 깊이 우선 탐색(DFS)에 이용된다.
- 재귀 함수의 동작 흐름과 같은 구조를 가진다.
스택의 선언
스택의 선언은 Stack<T> 스택 이름 = new Stack<>(); 형태로 선언할 수 있으며, 데이터 타입은 클래스 또는 래퍼 클래스로 선언할 수 있다.
import java.util.Stack;
class StackEx {
public static void main(String[] args) {
// Integer형 스택 선언
Stack<Integer> stackInt = new Stack<>();
// String형 스택 선언
Stack<String> stackStr = new Stack<>();
// Boolean형 스택 선언
Stack<Boolean> stackBool = new Stack<>();
}
}
스택의 값 추가 및 제거
스택은 add() 메서드 또는 push() 메서드를 통해 값을 하나씩 추가할 수 있다.
추가된 값을 빼내기 위해서는 pop() 메서드를 사용하여 하나씩 뺄 수 있다.
스택의 모든 내용을 제거하기 위해서는 clear() 메서드를 사용하여 제거할 수 있다.
import java.util.Stack;
class StackEx {
public static void main(String[] args) {
// Integer형 스택 선언
Stack<Integer> stackInt = new Stack<>();
// 값 추가 push()
stackInt.push(1);
stackInt.push(2);
stackInt.push(3);
// 1, 2, 3 순으로 값 추가
// 값 제거
stackInt.pop();
stackInt.pop();
stackInt.pop();
// 3, 2, 1 순으로 값 제거
// 값 추가 add()
stackInt.add(1);
stackInt.add(2);
stackInt.add(3);
// 1, 2, 3 순으로 값 추가
// 값 모두 제거
stackInt.clear();
}
}
pop() 메서드를 사용하면, 스택의 값이 제거됨과 동시에 해당 값을 반환한다. 하지만 clear() 메서드는 반환 값이 없다.
Stack 클래스 메서드
push(T t)
데이터를 스택에 추가하고, 해당 값을 반환한다.
import java.util.Stack;
class StackEx {
public static void main(String[] args) {
Stack<Integer> stackInt = new Stack<>();
stackInt.push(1);
stackInt.push(2);
stackInt.push(3);
System.out.println(stackInt);
}
}
// 출력
[1, 2, 3]
peek()
스택의 마지막 요소를 반환하며, 스택에는 변화를 주지 않는다. 즉, 스택에 가장 먼저 사용될 요소를 반환한다. 만약, 스택이 비어있을 경우 peek() 메서드 호출 시 NoSuchElementException 예외가 발생한다.
import java.util.Stack;
class StackEx {
public static void main(String[] args) {
Stack<Integer> stackInt = new Stack<>();
stackInt.push(1);
stackInt.push(2);
stackInt.push(3);
System.out.println(stackInt.peek());
}
}
// 출력
3
pop()
스택의 마지막 요소 제거함과 동시에 해당 값을 반환한다.
import java.util.Stack;
class StackEx {
public static void main(String[] args) {
Stack<Integer> stackInt = new Stack<>();
stackInt.push(1);
stackInt.push(2);
stackInt.push(3);
System.out.println(stackInt.pop());
System.out.println(stackInt);
}
}
// 출력
3
[1, 2]
empty()
스택이 비어있는지의 여부를 반환한다. 비어있을 경우 true, 비어있지 않을 경우 false를 반환한다.
import java.util.Stack;
class StackEx {
public static void main(String[] args) {
Stack<Integer> stackInt = new Stack<>();
System.out.println(stackInt.isEmpty());
stackInt.push(1);
System.out.println(stackInt.isEmpty());
}
}
// 출력
true
false
search()
메서드의 인자를 스택에서 검색하여 해당 위치를 반환한다. 만약 해당 인자가 여러 개일 경우, 마지막 위치를 반환한다. 여기서 위치는 인덱스가 아닌 빠져나오는 순서를 뜻한다.
또한, 찾는 값이 스택에 없을 경우 -1을 반환한다.
class StackEx {
public static void main(String[] args) {
Stack<Integer> stackInt = new Stack<>();
stackInt.push(1);
stackInt.push(2);
stackInt.push(3);
stackInt.push(1);
// [1, 2, 3, 1]
System.out.println(stackInt.search(2));
System.out.println(stackInt.search(1));
System.out.println(stackInt.search(4));
}
}
// 출력
3
1
-1