ホームページ  >  記事  >  バックエンド開発  >  Go言語のデータ構造に関する研究:キューとスタックの応用

Go言語のデータ構造に関する研究:キューとスタックの応用

PHPz
PHPzオリジナル
2024-04-08 12:57:01803ブラウズ

Go 言語では、キューは先入れ先出し (FIFO) の原則に従い、標準ライブラリのリスト パッケージを使用して実装されます。メッセージング システムでよく使用されます。スタックは後入れ方式に従います。 -first-out (LIFO) 原理であり、関数呼び出しの追跡やブラケット マッチングによく使用され、スライスを使用して実装できます。

Go言語のデータ構造に関する研究:キューとスタックの応用

#Go 言語のデータ構造の話: キューとスタックの応用

#Queue

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
}

実用的なケース: ブラケット マッチング

スタックは次のとおりです。ブラケット マッチングのチェッカー 良いツール:

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。