PHpullh
학습 라이브러리/Go/큐 & 스택 구현

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가 앞부분 메모리를 회수하지 못해 메모리 누수가 발생합니다.