Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Melaksanakan Baris Gilir dengan Betul dalam Go Menggunakan Tatasusunan Pekeliling?

Bagaimana untuk Melaksanakan Baris Gilir dengan Betul dalam Go Menggunakan Tatasusunan Pekeliling?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-28 11:39:18945semak imbas

How to Correctly Implement a Queue in Go Using a Circular Array?

Cara Melaksanakan Baris Gilir dalam Go

Soalan ini meneroka pelaksanaan baris gilir mudah dalam Go menggunakan tatasusunan bulat sebagai data asas struktur. Pendekatan ini mengikut algoritma yang digariskan dalam "Seni Pengaturcaraan Komputer." Walau bagaimanapun, kod awal yang dibentangkan menghadapi masalah dengan output yang salah.

Memahami Percanggahan

Isu utama dengan kod tersebut terletak pada kekurangan mekanisme untuk mengendalikan keadaan di mana barisan penuh. Pendekatan tatasusunan bulat memerlukan cara untuk menentukan apabila ia berada pada kapasiti. Kod asal tidak mempunyai semakan ini, mengakibatkan percubaan untuk menulis ganti elemen melebihi penghujung tatasusunan.

Memperhalusi Pelaksanaan

Untuk menyelesaikan isu ini, pengubahsuaian mudah diperkenalkan. Fungsi Enqueue kini termasuk syarat untuk mengesahkan sama ada indeks ekor tidak sama dengan indeks kepala. Jika mereka sama, baris gilir penuh, dan fungsi mengembalikan palsu. Jika tidak, ia menambahkan elemen pada baris gilir, menambah indeks ekor dan mengembalikan benar.

Kod Dipertingkat

Berikut ialah kod yang dikemas kini:

package main

import (
    "fmt"
)

type Queue struct {
    len        int
    head, tail int
    q          []int
}

func New(n int) *Queue {
    return &Queue{n, 0, 0, make([]int, n)}
}

func (p *Queue) Enqueue(x int) bool {
    p.q[p.tail] = x
    ntail := (p.tail + 1) % p.len
    if ntail != p.head {
        p.tail = ntail
        return true
    }
    return false
}

func (p *Queue) Dequeue() (int, bool) {
    if p.head == p.tail {
        return 0, false
    }
    x := p.q[p.head]
    p.head = (p.head + 1) % p.len
    return x, true
}

func main() {
    q := New(10)
    for i := 1; i < 13; i++ {
        fmt.Println(i, q.Enqueue(i))
    }
    fmt.Println()
    for i := 1; i < 13; i++ {
        fmt.Println(q.Dequeue())
    }
}

Dengan pengubahsuaian ini, kod mengendalikan elemen enqueuing dan dequeuing dengan betul, menghasilkan yang diharapkan keluaran:

1 true
2 true
3 true
4 true
5 true
6 true
7 true
8 true
9 true
10 true
11 true
12 true

11 true
12 true
1 true
2 true
3 true
4 true
5 true
6 true
7 true
8 true
9 true
10 true

Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Baris Gilir dengan Betul dalam Go Menggunakan Tatasusunan Pekeliling?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn