Golang'daki Sıra nedir?

Golang Daki Sira Nedir



Go, verimliliği, kullanım kolaylığı ve uyarlanabilirliği ile övülen popüler bir programlama dilidir. Zengin bir araç ve kitaplık seti ile Go, geliştiricilere güçlü ve verimli yazılım uygulamaları oluşturmak için gerekli kaynakları sağlar. Go'nun olmamasına rağmen kuyruklar bir veri yapısı olarak standart kütüphanesinde, çeşitli yöntemler kullanılarak uygulanabilirler. kavramından bahsedeceğiz. kuyruklar ve bu eğitimde bunların nasıl uygulanacağı.

Kuyruk nedir?

yazı öğeleri önceden belirlenmiş bir sırada depolamak ve almak için kullanılan veri yapılarıdır. Yığını andıran ve diziye yapışan doğrusal bir veri yapısıdır. FIFO (İlk Giren İlk Çıkar) kural. Bir bekleme listesine ya da ilk gelen kişiye önce hizmet verilen bir sıraya benzetilebilir. Mevcut bileşenler makinenin önünden düşürülür. sıra ve arkaya yeni öğeler eklenir.

Golang'da Kuyruk Uygulaması

uygulanması bir sıra in Go basit ve etkilidir ve aşağıdaki dört yöntem kullanılarak uygulanabilir.







1: Dilimler

Go'da bir dilim boyutu değişebilen dinamik bir dizidir. uygulamak için sıra kullanarak dilim , arkasına elemanlar ekleyebiliriz dilim Yerleşik ekleme işlevini kullanarak ve ön taraftaki öğeleri kaldırın. dilim dilimleme kullanarak.



Bu yaklaşımın oluşturulması kolaydır ve Go'nun yerleşik dilimleri sayesinde ekleme ve dilimleme işlemleri için iyi performans sunar. Ancak, öğeleri yeni bir temel diziye kopyalamayı içeren dilimleme yöntemi, eğer sıra genişler ve tekrarlanan kuyruktan çıkarma işlemlerini gerektirir.



Aşağıdaki kod, sıra Go'da bir dilim kullanarak uygulama.





ana paket

içe aktarmak 'fmt'

ana işlev ( ) {

sıra := yapmak ( [ ] arayüz { } , 0 )

sıra = eklemek ( sıra , 'İngilizce' )

sıra = eklemek ( sıra , 'urdu' )

sıra = eklemek ( sıra , 'Matematik' )

eğer sadece ( sıra ) > 0 {

öğe := sıra [ 0 ]

sıra = sıra [ 1 : ]

fmt. Yazdır ( öğe )

}

eğer sadece ( sıra ) == 0 {

fmt. Yazdır ( 'Sıra boş' )

} başka {

fmt. Yazdır ( sıra )

}

}

Yukarıdaki Go kodu, doğrudan oluşturmak için bir dilim kullanır. sıra veri yapısı. bu ekle() işlevi, öğeleri içine sıkıştırmak için kullanılır sıra dilim ve ilk öğeyi kaldıran bir dilim işlemi onları kuyruktan çıkarmak için kullanılır. İle fmt.Println() , kuyruktan çıkarılan öğe yazdırılır. Kod daha sonra şunu kullanır: sadece() kuyruğun boş olup olmadığını belirleyen işlev, boşsa ' Sıra boş” fmt.Println() işlevini kullanarak.

Çıktı



2: Bağlantılı Listeler

Listede bir sonraki düğüme bir değer ve işaretçi taşıyan düğümler bağlantılı bir liste oluşturur. Biri listenin önünü (başını), diğeri arkasını (kuyruğu) gösteren iki işaretçiyle, bir sıra bağlı bir liste kullanarak. Sıradan bir öğenin çıkarılması (sıradan çıkarma), listenin önündeki düğümün kaldırılmasını içerirken, kuyruğa bir öğe eklenmesi (sıralama), listenin arkasına yeni bir düğüm eklenmesini içerir.

Öğelerin kopyalanması gereken dilim tabanlı çözümün aksine, yalnızca baş ve kuyruk işaretçilerinin değiştirilmesi gerektiğinden, bu yöntem verimli sıraya alma ve kuyruktan çıkarma işlemlerine izin verir.

uygulamak için bağlantılı bir liste kullanın. sıra aşağıda sağlanan kodu kullanarak:

ana paket

içe aktarmak 'fmt'

Düğüm türü yapı {

değer arabirimi { }

Sonraki * düğüm

}

sıra yazın yapı {

KAFA * düğüm

kuyruk * düğüm

}

ana işlev ( ) {

sıra := & Sıra { KAFA : sıfır , kuyruk : sıfır }

yeni Düğüm := & düğüm { değer : 'İngilizce' , Sonraki : sıfır }

sıra. kuyruk = yeni Düğüm

sıra. KAFA = yeni Düğüm

yeni Düğüm = & düğüm { değer : 'urdu' , Sonraki : sıfır }

sıra. kuyruk . Sonraki = yeni Düğüm

sıra. kuyruk = yeni Düğüm

yeni Düğüm = & düğüm { değer : 'Matematik' , Sonraki : sıfır }

sıra. kuyruk . Sonraki = yeni Düğüm

sıra. kuyruk = yeni Düğüm

eğer sıra. KAFA != sıfır {

öğe := sıra. KAFA . değer

sıra. KAFA = sıra. KAFA . Sonraki

fmt. Yazdır ( öğe )

}

eğer sıra. KAFA == sıfır {

fmt. Yazdır ( 'Sıra boş' )

}

}

Düğüm yapısı, kuyruktaki her öğeyi temsil eder ve iki alan içerir: öğenin değerini depolamak için bir değer alanı ve sıradaki bir sonraki öğeyi işaret etmek için bir sonraki alan. Queue yapısı, sırasıyla kuyruğun önünü ve arkasını takip etmek için head ve tail özelliklerini kullanır. bu kuyruk ilk öğe head özelliği ile, son öğesi ise tail özelliği ile gösterilir.

Baş ve kuyruk parametreleri başlangıçta şu şekilde ayarlanmıştır: sıfır ne zaman yeni sıra main() işlevinde kurulur. Baş ve kuyruk işaretçileri, üç düğüm eklemek için güncellenir. sıra değerlerle 'ingilizce', 'Urduca', Ve 'Matematik'. bu 'İngilizce' öğe o zaman “kuyruktan çıkarıldı” (kaldırıldı) ön taraftan sıra değerini görüntüleyerek ve ana işaretçiyi aşağıdaki düğüme ilerleterek sıra . Kuyruğa alma işleminden sonra, eğer kafa null olursa sıra boş demektir ve “ Sıra boş” yazdırılır.

Çıktı

3: Yapılar

Go'da, adı verilen özel bir veri yapısı oluşturabilirsiniz. yapı temsil etmek sıra . Bu yapı saklamak için alanlara sahip olabilir. sıra öğe eklemek ve kaldırmak, kuyruğun boş olup olmadığını kontrol etmek ve mevcut sıra boyutunu almak için öğeler ve yöntemler.

Bu şekilde bir sıra in Go, daha fazla özellikle genişletilebilen ve özelleştirilebilen, kullanımı kolay yöntemlerle kullanışlı ve kapsüllenmiş bir uygulama sunar. Uygulamada değişiklik yapılmasına veya gerektiğinde yeni yetenekler eklenmesine izin veren esnek bir yaklaşımdır.

Özel oluşturma yapı yöntemlerle, karmaşıklığı artırabilen diğer iki yola kıyasla ek kod yazmayı içerir. Ancak, aynı zamanda programın uygulanması üzerinde daha fazla esneklik ve kontrol sağlar. sıra .

Aşağıdaki örnek, bir veri yapısını temsil etmek için bir veri yapısı oluşturmayı gösterir. sıra Go'da.

ana paket

içe aktarmak 'fmt'

sıra yazın yapı {
öğeler [ ] arayüz { }
}

işlev ( Q * Sıra ) Sıraya almak ( öğe arayüzü { } ) {
Q. öğeler = eklemek ( Q. öğeler , öğe )
}

işlev ( Q * Sıra ) kuyruktan çıkarma ( ) arayüz { } {
eğer sadece ( Q. öğeler ) == 0 {
geri dönmek sıfır
}
öğe := Q. öğeler [ 0 ]
Q. öğeler = Q. öğeler [ 1 : ]
geri dönmek öğe
}

işlev ( Q * Sıra ) Boş ( ) bool {
geri dönmek sadece ( Q. öğeler ) == 0
}

işlev ( Q * Sıra ) Boyut ( ) int {
geri dönmek sadece ( Q. öğeler )
}


ana işlev ( ) {

sıra := & Sıra { öğeler : yapmak ( [ ] arayüz { } , 0 ) }

sıra. Sıraya almak ( 'İngilizce' )
sıra. Sıraya almak ( 'urdu' )
sıra. Sıraya almak ( 'Matematik' )

öğe := sıra. kuyruktan çıkarma ( )
fmt. Yazdır ( öğe )
eğer sıra. Boş ( ) {
fmt. Yazdır ( 'Sıra boş' )
}

boyut := sıra. Boyut ( )
fmt. Yazdır ( 'Kuyruğun boyutu:' , boyut )
}

Yukarıdaki kodda, öğe dilimine bir öğe eklenir. Sıraya almak() sonuna taşıyan bir yöntemdir. sıra . Takiben İlk Giren İlk Çıkar (FIFO) ilke, kuyruktan çıkarma() yöntem önden bir öğe alır sıra ve geri verir. Öğe diliminin uzunluğu, Boş() olup olmadığını görmek için yöntemin kontrolü sıra boş. Öğeler diliminin uzunluğunu döndürerek, Boyut() yöntem akımı döndürür kuyruk boyut.

main() işlevi, kuyruk yapısı yeni oluşturmak için sıra , ona öğeler ekleyin, öğeleri kaldırın, olup olmadığını belirleyin. sıra boştur ve boyutunu hesaplayınız.

Çıktı

4: Kanallar

Go'da yerleşik kanal türü, bir sıra veri yapısı. Kanal, herhangi bir zamanda kuyruğa alınabilecek öğe sayısını sınırlamak için bir arabellek boyutuyla oluşturulabilir. Bir eleman eklemek için sıra kullanılarak kanala gönderilebilir. <- operatör, bir öğeyi sıradan kaldırmak için, aynı operatör kullanılarak kanaldan alınabilir.

Bu yaklaşım, aynı anda erişimin olduğu durumlarda oldukça yararlı olabilir. sıra kanallar eşzamanlı kullanım için doğası gereği güvenli olduğundan gereklidir.

Go kanallarının yazıldığını hatırlamak çok önemlidir. Bu, bir kanal aracılığıyla yalnızca belirli bir türdeki değerleri gönderebileceğiniz ve kanaldan yalnızca aynı türdeki değerleri alabileceğiniz anlamına gelir.

Bu, bir kanal oluşturmak için bir kanalın nasıl kullanılacağının bir örneğidir. sıra Go'daki veri yapısı.

ana paket

içe aktarmak (
'fmt'
'zaman'
)

sıra yazın yapı {
ürün arayüzü { }
}

funcNewQueue ( ) * Sıra {


Q := & Sıra {

öğeler : yapmak ( kanal arayüzü { } ) ,
}
git s süreç öğeleri ( )
geri dönmek Q
}

işlev ( Q * Sıra ) süreç öğeleri ( ) {
için öğe := aralık q. öğeler {
eğer öğe == 'İngilizce' {
fmt. Yazdır ( 'Sıkıldı:' , öğe )
}
}
}


işlev ( Q * Sıra ) Sıraya almak ( öğe arayüzü { } ) {

Q. öğeler <- öğe

}

işlev ( ) {
sıra := Yeni Sıra ( )

sıra. Sıraya almak ( 'İngilizce' )
sıra. Sıraya almak ( 'urdu' )
sıra. Sıraya almak ( 'Matematik' )

zaman . Uyumak ( 2 * zaman . Saniye )
}

Yukarıdaki kod bir oluşturur kuyruk yapısı tek bir alan ile öğeler hangisinin kanalı arayüz{} tip. bu Yeni Sıra() işlevi yeni bir örneğini oluşturur Sıra ve başlatır 'öğeler' yeni bir arabelleğe alınmamış kanal ile alan. Ayrıca kuyruğa eklenen öğeleri işlemek için yeni bir gorutin başlatır. işlem Öğeleri () işlev. bu işlem Öğeleri () işlev, alınan öğenin şuna eşit olup olmadığını kontrol eder: 'İngilizce' ve sadece o öğe için konsola bir mesaj yazdırır. bu Sıraya almak() kuyruğa yeni öğeler eklemek için kullanılır.

Çıktı

Çözüm

Kuyruk, Go'da öğeleri belirli bir sırada depolamak ve almak için kullanılan temel bir veri yapısıdır. uygulanması bir sıra Go'da iş parçacığı güvenlidir, bu da onları programlarda eşzamanlılık uygulamak için ideal bir seçim haline getirir. Dilimler, bağlantılı listeler, yapılar ve kanallar kullanılarak uygulanabilir. Tüm ayrıntılar, yukarıda verilen yönergelerde zaten sağlanmıştır.