스택은 데이터를 저장하고 접근하는 방법 중 하나로, 후입선출(LIFO, Last In, First Out)의 원칙을 따른다. 가장 최근에 삽입된 데이터가 가장 먼저 제거되는 구조를 갖는다.
LIFO 구조: 가장 최근에 추가된 항목이 가장 먼저 제거됨.
한 쪽 끝에서만 삽입과 삭제: 데이터의 삽입과 삭제는 스택의 한 쪽 끝에서만 이루어짐.
제한된 접근: 스택은 주로 push(삽입)과 pop(삭제) 두 가지 기본 연산으로 조작되며, 일반적으로 중간의 특정 원소에 직접 접근하는 것은 허용되지 않음.
간결한 구현: 간단하며 구현이 쉽다.
메모리 효율: 스택은 일반적으로 배열 또는 연결 리스트를 사용하며, 특정 연산들이 상수 시간에 이루어지므로 메모리를 효율적으로 활용할 수 있다.
선언 :
import java.util.Stack;
Stack<자료형> stack = new Stack<>();
사용 예시 :
import java.util.Stack;
import java.util.EmptyStackException;
public class Main {
public static void main(String[] args) {
// 스택 생성
Stack<Integer> stack = new Stack<>();
// 1. 삽입 (Push)
stack.push(42);
stack.push(15);
stack.push(7);
// 2. 삭제 (Pop)
try {
int deletedValue = stack.pop();
System.out.println("Deleted Value: " + deletedValue);
} catch (EmptyStackException e) {
System.out.println("Stack is empty.");
}
// 3. 삭제 (Remove)
try {
int removedValue = stack.remove(1);
System.out.println("Removed Value: " + removedValue);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("Invalid index.");
}
// 4. 스택의 Top에 있는 원소 반환
try {
int topValue = stack.peek();
System.out.println("Top Value: " + topValue);
} catch (EmptyStackException e) {
System.out.println("Stack is empty.");
}
// 5. 크기
int size = stack.size();
System.out.println("Stack Size: " + size);
// 6. 스택이 비어있는가?
boolean isEmpty = stack.isEmpty();
System.out.println("Is Stack Empty? " + isEmpty);
// 7. 스택 안에 해당 원소가 있는가?
int position = stack.search(15);
System.out.println("Position of 15: " + position);
// 8. 스택 값 변경
try {
int oldValue = stack.set(0, 99);
System.out.println("Old Value: " + oldValue);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("Invalid index.");
}
// 9. 해당 인덱스에 존재하는 값 반환
try {
int valueAtIndex = stack.elementAt(2);
System.out.println("Value at Index 2: " + valueAtIndex);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("Invalid index.");
}
// 10. 스택 초기화 (공백 스택 만들기)
stack.clear();
System.out.println("Stack Cleared. Is Stack Empty? " + stack.isEmpty());
}
}