2024. 8. 22. 16:08ㆍ코테/자료구조
스택(Stack)
Stack은 컴퓨터 과학에서 자주 사용되는 자료구조 중 하나로, 여러 애플리케이션에서 중요한 역할을 합니다.
예를 들어, 함수 호출 스택, 웹 브라우저의 뒤로 가기 기능, 텍스트 에디터의 실행 취소 기능 등이 스택의 원리를 사용합니다.
이제 스택의 기본 개념과 동작 원리에 대해 알아보겠습니다.
LIFO
Stack은 LIFO라는 특성을 가지는 데이터 구조 입니다.
LIFO는 후입선출(Last In First Out)이라고 하는데, 가장 최근에 들어온 것이 제일 먼저 나가야 한다는 뜻입니다.
우리 실생활에서 예시를 들어봅시다.
접시가 사진처럼 쌓여있을 때 중간에 있는 접시를 꺼내고 싶다면
오른쪽 사진처럼 위쪽에 있는 접시(꺼내려는 접시보다 나중에 쌓여진 접시)를 꺼낸 후 중간에 있는 접시를 꺼낼 수 있습니다.
스택 자료 구조도 마찬가지로 가장 최근에 들어온 데이터가 가장 먼저 나가야하는 구조로 이루어져 있습니다.
동작

스택의 추상자료형(Abstract Data Type - ADT)를 보면 입력연산은 Push, 출력연산은 Pop이라고 합니다.
위 이미지에서, 스택의 연산이 어떻게 이루어지는지 시각적으로 보여줍니다.
예를 들어, Push는 스택의 맨 위에 새로운 데이터를 추가하고, Pop은 맨 위에 있는 데이터를 제거하는 것을 의미합니다.
Peek은 데이터를 제거하지 않고 스택의 최상단 데이터를 조회하는 것을 보여줍니다.
구현
Java에서는 기본적으로 Stack 클래스가 제공되지만, 직접 구현을 하고싶다면 보통 LinkedList를 사용합니다.
Stack 사용
import java.util.Stack;
public class StackExample {
public static void main(String[] args) {
Stack<Integer> stack = new Stack<>();
// 스택에 값 추가
stack.push(10);
stack.push(20);
stack.push(30);
// 스택의 최상단 값 확인
System.out.println("최상단 값: " + stack.peek()); // 30
// 스택에서 값 꺼내기
System.out.println("최상단 값: " + stack.pop()); // 30
System.out.println("pop후에 최상단 값: " + stack.peek()); // 20
// 스택이 비어있는지 확인
System.out.println(stack.isEmpty()); // false
}
}
LinkedList 사용
import java.util.LinkedList;
class CustomStack<T> {
private LinkedList<T> list = new LinkedList<>();
// 스택에 값 추가
public void push(T value) {
list.addFirst(value);
}
// 스택에서 값 꺼내기
public T pop() {
// 스택에 값이 있는지 확인 후 데이터 반환
if (!isEmpty()) {
return list.removeFirst();
}
return null;
}
// 스택의 최상단 값 확인
public T peek() {
// 스택에 값이 있는지 확인 후 데이터 반환
if (!isEmpty()) {
return list.getFirst();
}
return null;
}
// 스택이 비어있는지 확인
public boolean isEmpty() {
return list.isEmpty();
}
// 스택의 크기 확인
public int size() {
return list.size();
}
}
public class StackExample {
public static void main(String[] args) {
CustomStack<Integer> stack = new CustomStack<>();
// 스택에 값 추가
stack.push(10);
stack.push(20);
stack.push(30);
// 스택의 최상단 값 확인
System.out.println("최상단 값: " + stack.peek()); // 30
// 스택에서 값 꺼내기
System.out.println("최상단 값: " + stack.pop()); // 30
System.out.println("pop후에 최상단 값: " + stack.peek()); // 20
// 스택이 비어있는지 확인
System.out.println(stack.isEmpty()); // false
}
}