Go 언어에서 대기열은 FIFO(선입선출) 원칙을 따르며 표준 라이브러리의 목록 패키지를 사용하여 구현됩니다. 스택은 후입선출 방식을 따릅니다. -out(LIFO) 원리이며 함수 호출 추적 및 대괄호 일치에 자주 사용됩니다.
Go 언어 데이터 구조 이야기: 큐와 스택의 응용
Queue
큐는 FIFO(선입선출) 원칙을 준수하는 데이터 구조입니다. 즉, 대기열에 가장 먼저 입력된 요소가 먼저 제거됩니다. 대기열은 다음 시나리오에서 매우 유용합니다.
Go 언어로 대기열 구현
Go에서 대기열의 가장 일반적인 구현 언어 container/list
표준 라이브러리 패키지를 사용합니다:
import ( "container/list" ) // 定义队列类型 type Queue struct { items *list.List } // 创建队列 func NewQueue() *Queue { return &Queue{ items: list.New(), } } // 进队 func (q *Queue) Enqueue(item interface{}) { q.items.PushBack(item) } // 出队 func (q *Queue) Dequeue() interface{} { if q.IsEmpty() { return nil } front := q.items.Front() q.items.Remove(front) return front.Value } // 判断队列是否为空 func (q *Queue) IsEmpty() bool { return q.items.Len() == 0 }
실제 사례: 메시지 대기열
메시지 대기열은 대기열의 일반적인 응용 시나리오입니다. 메시지 큐를 구현하기 위해 Go 언어의 큐를 사용할 수 있습니다:
func main() { // 创建消息队列 queue := NewQueue() // 向队列发送消息 queue.Enqueue("消息 1") queue.Enqueue("消息 2") // 接收消息 for { msg := queue.Dequeue() if msg == nil { break } fmt.Println(msg) } }
Stack
스택은 LIFO(후입선출) 원칙을 준수하는 데이터 구조입니다. 즉, 스택에 추가된 마지막 요소가 먼저 제거됩니다. 스택은 다음 시나리오에서 매우 유용합니다.
Go 언어에서 스택 구현
Go 언어에서 스택의 가장 간단한 구현은 슬라이스를 사용하는 것입니다.
// 定义栈类型 type Stack []interface{} // 进栈 func (s *Stack) Push(item interface{}) { *s = append(*s, item) } // 出栈 func (s *Stack) Pop() interface{} { if s.Empty() { return nil } top := (*s)[len(*s)-1] *s = (*s)[:len(*s)-1] return top } // 判断栈是否为空 func (s *Stack) Empty() bool { return len(*s) == 0 }
실용적인 전투 사례: 브래킷 매칭
Stack은 브래킷 매칭을 확인하는 훌륭한 도구입니다:
func isBalanced(expr string) bool { stack := Stack{} for _, char := range expr { if char == '(' || char == '[' || char == '{' { stack.Push(char) } else if char == ')' || char == ']' || char == '}' { if stack.Empty() { return false } top := stack.Pop() if (char == ')' && top != '(') || (char == ']' && top != '[') || (char == '}' && top != '{') { return false } } } return stack.Empty() }
위 내용은 Go 언어 데이터 구조 연구: 큐와 스택의 응용의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!