GO · 컬렉션
큐 & 스택 구현
슬라이스로 큐(FIFO)와 스택(LIFO)을 구현합니다. 제네릭으로 타입 안전하게 만듭니다.
컬렉션중급stackqueuegenericsdata-structure
핵심 설명
슬라이스로 큐(FIFO)와 스택(LIFO)을 구현합니다. 제네릭으로 타입 안전하게 만듭니다.
Go code
package main
import "fmt"
// 제네릭 스택
type Stack[T any] struct{ items []T }
func (s *Stack[T]) Push(v T) { s.items = append(s.items, v) }
func (s *Stack[T]) Pop() (T, bool) {
if len(s.items) == 0 { var z T; return z, false }
v := s.items[len(s.items)-1]
s.items = s.items[:len(s.items)-1]
return v, true
}
func (s *Stack[T]) Len() int { return len(s.items) }
// 제네릭 큐
type Queue[T any] struct{ items []T }
func (q *Queue[T]) Enqueue(v T) { q.items = append(q.items, v) }
func (q *Queue[T]) Dequeue() (T, bool) {
if len(q.items) == 0 { var z T; return z, false }
v := q.items[0]
q.items = q.items[1:]
return v, true
}
func (q *Queue[T]) Len() int { return len(q.items) }
func main() {
stack := &Stack[int]{}
stack.Push(1); stack.Push(2); stack.Push(3)
v, _ := stack.Pop()
fmt.Println("스택 Pop:", v) // 3
queue := &Queue[string]{}
queue.Enqueue("첫째"); queue.Enqueue("둘째")
s, _ := queue.Dequeue()
fmt.Println("큐 Dequeue:", s) // 첫째
}학습 팁
큐의 Dequeue에서 q.items[1:]는 메모리를 해제하지 않습니다. 큰 큐에서는 링 버퍼를 사용하세요.
주의할 점
슬라이스 기반 큐에서 앞에서 제거(items[1:])만 반복하면 GC가 앞부분 메모리를 회수하지 못해 메모리 누수가 발생합니다.
자주 묻는 질문
큐 & 스택 구현란 무엇인가요?
슬라이스로 큐(FIFO)와 스택(LIFO)을 구현합니다. 제네릭으로 타입 안전하게 만듭니다.
큐 & 스택 구현 학습 시 주의할 점은 무엇인가요?
슬라이스 기반 큐에서 앞에서 제거( items[1:] )만 반복하면 GC가 앞부분 메모리를 회수하지 못해 메모리 누수가 발생합니다.
Continue Learning
Go 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.