스택(stack)은 데이터를 입력된 순서대로 쌓고, 나중에 들어온 데이터부터 먼저 꺼내 사용하는 자료 구조이다.
스택의 특징
스택은 대표적으로 프로그램을 수행할때 사용합니다.
Main 프로그램에서 함수 A를 호출하면 Main 프로그램 위에 함수 A가 쌓이고, 함수 A의 수행 중에 함수 B가 호출되면, 함수 A위에 함수 B가 스택처럼 쌓이게 된다.
함수 B의 실행이 완료되면 함수 A가 실행되고, 함수 A의 실행이 완료되면 주 프로그램의 실행이 시작됩니다 (LIFO)
자바에서 배열로 스택 구현하기
import java.util.ArrayList;
class MyStack {
private ArrayList<String> arrayStack = new ArrayList<String>();
public void push(String data) {
arrayStack.add(data);
}
public String pop() {
int len = arrayStack.size();
if (len == 0) {
System.out.println("스택이 비었습니다.");
return null;
}
return arrayStack.remove(len - 1);
}
public String peek() {
int len = arrayStack.size();
if (len == 0) {
System.out.println("스택이 비었습니다.");
return null;
}
return arrayStack.get(len - 1);
}
}
큐(queue)는 데이터를 입력된 순서대로 쌓고, 처음 들어온 데이터부터 먼저 꺼내 사용하는 자료 구조이다.
큐의 특징
컴퓨터 안에 여러 개의 프로세스가 수행 중인데, 새로운 프로세스가 수행되어야 하는 경우 기존에 수행되던 프로세스 중에서 가장 먼저 메모리에 올라온 프로세스가 아웃되고(실행), 새로운 프로세스를 메모리에 올리게 됩니다. 이 경우에 운영체제는 현재 수행 중인 프로세소를 큐의 형태로 관리합니다.
Windows 운영체제를 사용하는 컴퓨터에서 수행 중인 프로그램에 이벤트 (버튼 누르기, 윈도우 크기 조정, 메뉴 선택하기 등)가 발생하면 발생한 이벤트가 큐에 저장되고, 수행중인 프로그램이 큐에 저장된 것을 앞에서부터 읽어 와서 처리한다 (FIFO).
자바에서 배열로 큐 구현하기
class MyQueue {
private ArrayList<String> arrayQueue = new ArrayList<String>();
public void enQueue(String data) {
arrayQueue.add(data);
}
public String deQueue() {
int len = arrayQueue.size();
if (len == 0) {
System.out.println("큐가 비었습니다.");
return null;
}
return arrayQueue.remove(0);
}
}
스택 두 개로 큐 구현하기
스택1과 스택2로 큐를 구현해보자. 스택 두 개를 이용하여 아래와 같은 과정으로 큐를 구현할 수 있다.
큐 두개로 스택 구현하기
큐1과 큐2로 스택을 구현해보자. 큐 두 개를 이용하여 아래와 같은 과정으로 스택을 구현할 수 있다.
우선순위 큐(priority queue)는 큐에 들어간 순서와는 상관 없이 우선순위가 높은 데이터가 먼저 큐에서 제거(사용)되는 것을 말한다. 우선순위 큐에서 모든 항목에는 우선순위가 있고, 우선순위가 높은 요소는 낮은 요소보다 큐에서 먼저 제거되며, 우선순위가 같은 경우에는 큐에 들어온 순서에 따라 제거 순서가 결정된다.
위 그림에서 숫자가 높을 수록 우선순위가 높고 input이 1, 3, 5, 11, 7, 9의 순서로 큐에 들어왔다고 가정하면 큐와 우선순위 큐의 dequeue 순서는 다음과 같이 정해진다.
queue: 1, 3, 5, 11, 7, 9
prioirty queue: 11, 9, 7, 5, 3, 1
우선순위 큐는 array, linked list, heap으로 구현할 수 있는데, 각 구현 방법에 따른 시간 복잡도는 아래와 같다.
힙 방식 구현으로는 최악의 경우라도 O(logn)을 보장하기 때문에 일반적으로 힙을 이용하여 우선순위 큐를 구현한다.
추가로 공부해야 할 내용
참고 링크
[Favtutor]Stack vs Queue
우선순위 큐(Prioirty Queue) 개념 및 구현