큐(Queue) 구현하기 in Go
큐는 선입 선출 (FIFO) 원리를 따라 정렬된 데이터 구조입니다.
golang에서 Slice
를 사용하면 쉽게 큐를 구현할 수 있습니다.
- built-in 함수인 append를 사용하여 enqueue를 구현합니다.
- 배열의 첫 번째 요소를 잘라내는 방식으로 dequeue를 구현합니다.
구현
package main
import "fmt"
type Queue []interface{}
//IsEmpty - 큐가 비어있는지 확인하는 함수.
func (q *Queue) IsEmpty() bool {
return len(*q) == 0
}
//Enqueue - 큐에 값을 추가하는 함수.
func (q *Queue) Enqueue (data interface{}) {
*q = append(*q, data) // 큐 끝에 값을 추가함.
fmt.Printf("Enqueue: %v\n", data)
}
//Dequeue - 큐에 첫번째 요소를 반환하고 제거하는 함수.
func (q *Queue) Dequeue () interface{} {
if q.IsEmpty() {
fmt.Println("queue is empty")
return nil
}
data := (*q)[0] // 큐에 첫번째 값을 가져옴.
*q = (*q)[1:] // 큐에 첫번째 데이터를 제거함.
fmt.Printf("Dequeue: %v\n", data)
return data
}
func main (){
q := Queue{}
q.Enqueue(1)
q.Enqueue(2)
q.Enqueue(3)
fmt.Printf("%v\n",q)
q.Dequeue()
fmt.Printf("%v\n",q)
}
Output:
Enqueue: 1
Enqueue: 2
Enqueue: 3
[1 2 3]
Dequeue: 1
[2 3]
소스는 아래 깃허브에서 받을 수 있습니다.
github.com/dev-yyh/Go/tree/main/DS/queue
설명
- 모든 유형을 저장할 수 있게 빈 인터페이스(interface{}) 유형으로 큐를 초기화합니다.
- enqueue 함수는 append 함수를 사용하여 배열 마지막 부분에 값을 추가해 줍니다.
- dequeue 함수는 큐가 비어있는지 확인하고 비어있지 않다면 첫번째 위치에 있는 값을 가져온 뒤 삭제합니다.