Stack ADT
연산 (Operations)
boolean isFull()→ 스택이 가득 찼는지 확인하여 boolean 값을 반환합니다.boolean isEmpty()→ 스택이 비어 있는지 확인하여 boolean 값을 반환합니다.void push(itemType item)→ 스택에 데이터를 추가합니다.itemType pop()→ 스택에서 최근에 추가된 데이터를 제거하고 해당 값을 반환합니다.
상태 (State)
int top→ 스택에서 최근에 추가된 데이터의 위치를 기록합니다.itemType data[maxsize]→ 스택의 데이터를 관리하는 배열로, 최대maxsize개의 데이터를 관리합니다.
세부 동작 (Detailed Operations)
스택에 데이터를 추가하고 빼는 경우에서의 세부동작을 공부하면 추후 코딩테스트나 면접에서 도움이 될겁니다.
data(3) 추가
- isFull() → 가득 찼는지 먼저 확인
- 상태 top (시작 -1) 을 1 증가 시켜
- data[top] 에 data 추가.
data pop()
- isEmpty() → 비어있는지 먼저 확인
- 상태 top 1감소
- 데이터 3 반환해
→ 여기서 의문 ?? ‘3이 남아있는데? ‘ 라고 생각할 수 있다. ADT에서 top은 최근에 삽입한 데이터의 위치 상태를 나타낸다. 즉 top이 가리키는 위치가 -1 이므로 실제 data 배열에 데이터가 남아 있더라도 스택은 비어 있다고 봐도 된다.
Data 추가 (Push)
isFull()→ 스택이 가득 찼는지 먼저 확인합니다.top을 1 증가시킵니다.data[top]에 새로운 데이터를 추가합니다.
Data 제거 (Pop)
isEmpty()→ 스택이 비어 있는지 먼저 확인합니다.top을 1 감소시킵니다.data[top + 1]의 값을 반환합니다.
스택 ADT의 예시 구현
public class Stack<T> {
private int maxSize;
private int top;
private T[] data;
@SuppressWarnings("unchecked")
public Stack(int maxSize) {
this.maxSize = maxSize;
this.data = (T[]) new Object[maxSize];
this.top = -1;
}
public boolean isFull() {
return top == maxSize - 1;
}
public boolean isEmpty() {
return top == -1;
}
public void push(T item) {
if (isFull()) {
throw new IllegalStateException("Stack is full");
}
data[++top] = item;
}
public T pop() {
if (isEmpty()) {
throw new IllegalStateException("Stack is empty");
}
return data[top--];
}
}
ArrayDeque
ArrayDeque는 Java의 Deque 인터페이스를 구현한 클래스 중 하나로, 스택과 큐의 기능을 모두 제공합니다. ArrayDeque는 배열 기반의 데이터 구조로, ArrayList와 유사하지만 스택과 큐 연산에 최적화되어 있습니다.
ArrayDeque의 주요 특징
- 빠른 성능:
ArrayDeque는 동적 배열을 사용하여 요소를 저장하며, 스택 연산 (push, pop)과 큐 연산 (offer, poll)을 모두 상수 시간 (O(1))에 수행합니다. - 메모리 효율성:
ArrayDeque는 동적 배열 크기를 조정하여 메모리 사용을 최소화합니다. - 멀티스레드 환경에서는 주의:
ArrayDeque는 동기화되지 않으므로, 멀티스레드 환경에서 안전하지 않습니다. 동기화된 스택 또는 큐가 필요한 경우Collections.synchronizedDeque또는ConcurrentLinkedDeque를 사용해야 합니다.
ArrayDeque의 사용 예시
import java.util.ArrayDeque;
import java.util.Deque;
public class ArrayDequeExample {
public static void main(String[] args) {
Deque<Integer> stack = new ArrayDeque<>();
// Push elements
stack.push(10);
stack.push(20);
stack.push(30);
// Pop elements
System.out.println(stack.pop()); // Output: 30
System.out.println(stack.pop()); // Output: 20
// Check if stack is empty
System.out.println(stack.isEmpty()); // Output: false
// Push more elements
stack.push(40);
stack.push(50);
// Peek at the top element
System.out.println(stack.peek()); // Output: 50
}
}
요약
Stack ADT는isFull,isEmpty,push,pop메서드를 통해 스택의 기본 연산을 제공합니다.ArrayDeque는 스택과 큐의 기능을 모두 제공하며, 성능이 뛰어나고 메모리 효율적인 데이터 구조입니다.- Java의
ArrayDeque는 스택과 큐 연산에 최적화되어 있으며, 멀티스레드 환경에서는 동기화된 대안을 사용하는 것이 좋습니다.
'JAVA 코딩테스트 참고' 카테고리의 다른 글
| 큐 Queue (0) | 2024.08.20 |
|---|---|
| Map - EntrySet 사용 (0) | 2024.04.24 |