Stack

스택이란?

스택은 '쌓다'와 같은 의미로 프링글스와 같이 처음에 들어간 과자는 맨 아래에 있고 마지막에 들어간 과자는 맨 위에 있어 가장 마지막에 들어간 과자부터 먼저 꺼내어 먹는 구조를 갖는다.
즉, 가장 늦게 들어간 데이터가 가장 먼저 나가는 후입선출(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는 큐처럼 사용할 수 있고 스택처럼도 사용할 수 있기에 원하는 요구사항에 맞춰서 사용하면 된다.