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!