- 데이터를 후입선출, Last In First Out (LIFO) 원칙을 따르는 자료구조
- 프링글스를 떠올리면, 가장 처음 만든 과자가 밑바닥에 들어가고 가장 마지막이 위에 위치하는데, 먹을때는 마위에 있는것부터 먹는걸 떠올리면 된다
특징
- LIFO 원칙 : 마지막에 들어간 요소가 가장 먼저 출력된다
- 접근 제한 : 구조상 데이터의 끝쪽에서만 추가, 제거가 가능하다, 끝쪽을 top이라 한다
장점과 단점
- Stack은 구현이 간단하고 데이터 추가, 삭제가 빠르단 장점이 있다
- 허나 데이터 접근은 top에만 한정되기에, 특정 데이터에 접근하려면 그 앞의 데이터들을 모두 제거해야 하는 불편함이 있다
사용처
- 프로그래밍 문제 같은 경우엔 괄호의 쌍을 검사할 때 활용된다
- 페이지 또는 명령어의 되돌리기, 이전 기능을 구현할 때 활용할 수 있다
예시 코드
class Stack<T> {
private val elements: MutableList<T> = mutableListOf()
fun push(item: T) {
elements.add(item)
}
fun pop(): T? {
if (!isEmpty()) {
return elements.removeAt(elements.size - 1)
}
return null
}
fun isEmpty(): Boolean {
return elements.isEmpty()
}
fun peek(): T? {
if (!isEmpty()) {
return elements[elements.size - 1]
}
return null
}
}
val stack = Stack<Int>()
stack.push(1)
stack.push(2)
stack.push(3)
println(stack.pop()) // 3
println(stack.peek()) // 2