Heim  >  Artikel  >  Backend-Entwicklung  >  Forschung zur Datenstruktur der Go-Sprache: Anwendung von Warteschlange und Stapel

Forschung zur Datenstruktur der Go-Sprache: Anwendung von Warteschlange und Stapel

PHPz
PHPzOriginal
2024-04-08 12:57:01803Durchsuche

In der Go-Sprache folgt die Warteschlange dem First-In-First-Out-Prinzip (FIFO) und wird mithilfe des Listenpakets in der Standardbibliothek implementiert. Es wird häufig in Messaging-Systemen verwendet -out (LIFO)-Prinzip und wird häufig zur Verfolgung von Funktionsaufrufen und zum Klammerabgleich verwendet. Es wird mithilfe von Slices implementiert.

Forschung zur Datenstruktur der Go-Sprache: Anwendung von Warteschlange und Stapel

Gespräch über die Datenstruktur der Go-Sprache: Anwendung von Warteschlange und Stapel

Warteschlange

Warteschlange ist eine Datenstruktur, die dem First-In-First-Out-Prinzip (FIFO) entspricht. Dies bedeutet, dass die frühesten in die Warteschlange eingegebenen Elemente zuerst entfernt werden. Warteschlangen sind in den folgenden Szenarien sehr nützlich:

  • Nachrichtenübermittlungssysteme, z. B. Nachrichtenwarteschlangen
  • Puffer, z. B. Netzwerkanforderungswarteschlangen

Implementierung von Warteschlangen in der Go-Sprache

Die häufigste Implementierung von Warteschlangen in Go Sprache Es verwendet das container/listStandardbibliothekspaket:

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
}

Praktischer Fall: Nachrichtenwarteschlange

Nachrichtenwarteschlange ist ein typisches Anwendungsszenario für Warteschlangen. Wir können die Warteschlange in der Go-Sprache verwenden, um eine Nachrichtenwarteschlange zu implementieren:

func main() {
    // 创建消息队列
    queue := NewQueue()

    // 向队列发送消息
    queue.Enqueue("消息 1")
    queue.Enqueue("消息 2")

    // 接收消息
    for {
        msg := queue.Dequeue()
        if msg == nil {
            break
        }
        fmt.Println(msg)
    }
}

Stack

Der Stack ist eine Datenstruktur, die dem Last-in-First-out (LIFO)-Prinzip folgt. Dies bedeutet, dass das zuletzt zum Stapel hinzugefügte Element zuerst entfernt wird. Der Stapel ist in den folgenden Szenarien sehr nützlich:

  • Funktionsaufrufverfolgung
  • Klammerabgleich

Implementierung des Stapels in der Go-Sprache

Die einfachste Implementierung des Stapels in der Go-Sprache ist die Verwendung von Slices:

// 定义栈类型
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
}

Praktischer Kampffall: Bracket-Matching

Stack ist ein großartiges Tool zum Überprüfen der Bracket-Matching:

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()
}

Das obige ist der detaillierte Inhalt vonForschung zur Datenstruktur der Go-Sprache: Anwendung von Warteschlange und Stapel. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn