스택이란?
스택은 '쌓다'와 같은 의미로 프링글스와 같이 처음에 들어간 과자는 맨 아래에 있고 마지막에 들어간 과자는 맨 위에 있어 가장 마지막에 들어간 과자부터 먼저 꺼내어 먹는 구조를 갖는다.
즉, 가장 늦게 들어간 데이터가 가장 먼저 나가는 후입선출(LIFO) 구조로 되어있어, 나중에 들어온 데이터부터 처리할 때 유용하게 사용된다.
스택의 특징
- 후입선출 : 먼저 들어온 데이터는 나중에 빠져나가는 구조
- 단방향 입출력 구조 : 데이터가 들어오는 방향과 나가는 방향이 동일하다.
- 데이터를 하나씩만 넣고 뺄 수 있다.
스택 생성
스택은 간단하게 new Stack();을 통해 생성할 수 있다.
Stack<Integer> intStack = new Stack();
스택의 주요 메서드
- boolean empty() : Stack이 비어있는지 알려준다.
- Object peek() : Stack의 맨 위의 객체를 반환, 비어있을 경우 EmptyStackException 발생한다.
- Object pop() : Stack 맨 위의 객체를 꺼낸다. 비어있을 경우 EmptyStackException 발생한다.
- Object push(Object item) : Stack에 객체를 저장한다.
- int search(Object item) : item이 있는지 찾아서 그 위치를 반환한다. 없으면 -1 반환하고 1부터 시작한다.
스택에 객체 넣기
Stack<Integer> intStack = new Stack<Integer>();
intStack.push(1);
스택 요소 꺼내기
int num = intStack.pop();
스택 최상단 요소 확인하기
int num = intStack.peek();
스택 요소 확인하기
int index = intStack.search(1);
// 있으면 인덱스, 없으면 -1 반환
스택 사이즈 확인하기
int size = intStack.size();
Stack 클래스의 deprecated
Stack 클래스는 vector를 상속받아 구현되었다. Vector는 굉장히 오래된 클래스이고 취약점이 많기 때문에 큰 문제점을 가지고 있다. 또한 스택에 필요없는 add메서드가 노출되기에 의도치 않은 동작이 실행되면서 오류를 범할 수 있다.
Stack 클래스 대신 Deque 사용해라
Deque<Integer> stack = new ArrayDeque<Integer>();
deque는 큐처럼 사용할 수 있고 스택처럼도 사용할 수 있기에 원하는 요구사항에 맞춰서 사용하면 된다.