Stack & Queue
개요
컴퓨터 관련 공부를 하다보면 용어가 너무 어려워보여서 공부하길 미뤄둘 때가 있다. 스택과 큐도 처음 용어를 들었을 때 굉장히 어려워보였다. 그래서 조금 쉽게 풀어서 설명해본다.
스택이란(Stack) 쌓다라는 의미로 데이터를 차곡차곡 쌓아 저장하는 자료구조이다.
그냥 멘토스나 창고에 위로 차곡차곡 쌓아둔 물건과 같다. 후입선출이라고도 할 수 있겠다.
멘토스를 먹을 때 가장 위를 뜯어서 하나씩 꺼내먹곤 한다. 위와 아래를 모두 뜯어서 먹는 사람은 아마 없지않을까
창고위에 쌓아둔 물건도 생각해보면 위에 쌓인 것부터 사용하곤한다.
괜히 귀찮아서 아래 쌓여있는 것을 빼려다가 다 무너지곤한다.
이런 특성을 영어로는 LIFO(Last In Frist Out)이라고 한다.
자바에서 Stack은 다음과 같이 쓸 수 있다.
Stack<Integer> stack = new Stack<>();
stack.add(1); //stack에 값을 추가하는 메소드이다.
stack.peek(); //스택의 마지막 요소를 스택에 영향을 주지 않고 반환만 한다.
//현재 가장 마지막으로 들어가있는 값이 무엇인지 확인할 수 있다. 가장 위에있는 멘토스가 무슨맛인지만 확인한다.
stack.pop(); //스택의 마지막 요소를 제거하고 반환한다. 즉 멘토스를 하나 꺼내먹는 것과 같다.
stack.isEmpty(); //스택이 비어있는지 확인한다. 비어있다면 true 자료가 있다면 false를 리턴한다.
while(!stack.isEmpty()) {
//스택에 반복적인 작업을 하고싶다면 이렇게 할 수 있다.
}
큐(Queue)란 한 쪽에서 들어오고 다른 한 쪽에서 나가는 구조이다.
실생활의 예로는 종이컵 디스팬서의 윗부분에서 종이컵을 채워넣고 밑에부분에서 종이컵을 빼는 것과 은행에서 대기표를 뽑고 기다리는 것과 같다. 선입선출이라 할 수 있겠다.
영어로 이런 특성을 FIFO(First In First Out)이라 한다.
자바에서 큐는 일반 자료구조를 사용하는 것처럼 사용하지 않고 큐 인터페이스의 구현체를 설정하여 사용한다.
주로 LinkedList를 구현체로서 사용한다. 주로 BFS(넓이 우선 탐색)을 할 때 사용한다.
Queue<Integer> queue = new LinkedList<>();
queue.add(1); //두 가지 메소드로 자료를 넣을 수 있는데 차이점은 잘 모르겠다.
queue.offer(1);
queue.poll(); //첫번째 값 꺼내기.
queue.peek(); //첫번째 값 반환.
queue.isEmpty(); //큐가 비어있는지 확인.