더북(TheBook)

Queue는 먼저 들어온 데이터를 먼저 처리FIFO, First In First Out하는 데 사용하는 자료 구조다. 큐는 사람들이 차례로 줄을 서 있고, 줄의 제일 앞에 서 있는 사람부터 자기 일을 처리하는 모습을 연상하면 된다. 새로 도착한 사람은 줄의 맨 뒤에 서서 기다린다.

큐는 다음 세 가지 함수로 구현한다.

Enqueue : 줄의 맨 뒤에 데이터를 추가한다.

Dequeue : 줄의 맨 앞에 있는 데이터를 가져온다. 가져온 데이터는 줄에서 빠진다.

Size : 줄의 길이, 즉 자료 구조 내에 저장된 데이터의 수를 반환한다.

이 세 가지 함수를 지원하는 큐를 작성해보자.

> q <- c()
> q_size <- 0
> enqueue <- function(data) {
+ q <<- c(q, data)
+ q_size <<- q_size + 1
+ }
> dequeue <- function() {
+ first <- q[1]
+ q <<- q[-1]
+ q_size <<- q_size - 1
+ return(first)
+ }
> size <- function() {
+ return(q_size)
+ }

위 코드에서 큐에 저장될 데이터는 벡터 q를 사용해 저장하고 있다. q_size는 큐에 저장된 데이터 수를 기록하는 목적으로 사용한다.

함수 enqueue( )는 q에 이미 저장되어 있는 데이터에 인자로 받은 데이터를 추가하여 다시 변수 q에 할당한다. 이때 <<-를 사용해 전역 변수에 있는 q를 직접 접근하게 했다. 마지막으로 q_size의 값을 1 증가시킨다.

함수 dequeue( )는 q에 저장된 데이터 중 첫 번째 요소를 first에 저장하고, q에는 이 데이터를 제외한 데이터를 저장한 다음 first를 반환한다. 이때 q_size가 1 감소한다.

함수 size( )는 q의 길이인 q_size를 반환한다.

위 코드는 다음과 같이 사용할 수 있다.

> enqueue(1)        # 1이 줄의 끝에 선다.
> enqueue(3)        # 3이 줄의 끝에 선다.
> enqueue(5)        # 5가 줄의 끝에 선다.
> print(size())     # 줄의 길이는 3이다.
[1] 3
> print(dequeue())  # 첫 번째로 대기 중인 데이터인 1을 가져온다.
[1] 1
> print(dequeue())  # 두 번째로 대기 중인 데이터인 3을 가져온다.
[1] 3
> print(dequeue())  # 세 번째로 대기 중인 데이터인 5를 가져온다.
[1] 5
> print(size())     # 데이터가 없어 크기가 0이다.
[1] 0
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.