Veri Yapıları- Data Structures
Linked List, Stack, Queue,Tree
Bağlı Liste Yapısı (Linked List)
- Listede bir başlangıç (head) elemanı, birde sonuncu (tail) elamanı vardır.
- Listede aktif (current) eleman şu anda bilgilerine ulaşabileceğimiz elemandır.
- Düğüm (node) ismi verilen bir elemanda veri saklar. Yeni veri ekleneceğinde bir düğüm oluşturulur ve listeye bağlanır. Eleman silineceğinde ise düğümlerden birisi silinir, kopan bağ tekrar sağlanır.
Tek-Yönlü Bağlı Liste (Singly Linked List)
Listedeki elemanlar arasında sadece tek bir bağ vardır. Bu tür bağlı listelerde hareket yönü sadece listenin başından sonuna doğrudur.
Çift-Yönlü Bağlı Liste (Doubly Linked List)
Listedeki elemanlar arasında iki yönlü bağ vardır. Elemanın bağlantı bilgisi bölümünde iki gösterici bulunur. Bu göstericinin biri kendisinden sonra gelen elemanı diğeri ise kendisinden önce gelen elamanın adres bilgisini tutar.
Bu sayede listenin hem başından sonuna hem de listenin sonundan başına doğru hareket edilebilir. Bu yöntem daha esnek bir yapıya sahip olduğundan bazı problemlerin çözümünde daha işlevsel olabilmektedir.
Dairesel Listeler (Circular Lists)
Tek Yönlü Dairesel Bağlı Listeler : Listedeki elemanlar arasında tek yönlü bağ vardır. Tek yönlü bağlı listelerden tek farkı ise son elemanın göstericisi ilk listenin ilk elamanının adresini göstermesidir. Bu sayede eğer listedeki elemanlardan birinin adresini biliyorsak listedeki bütün elemanlara erişebiliriz.
İki Yönlü Dairesel Bağlı Listeler : Hem dairesellik hem de çift bağlılık özelliklerine sahip listelerdir. İlk düğümden önceki düğüm son, son düğümden sonraki düğüm de ilk düğümdür.
Bağlantılı Listelerde Arama –Kaba Kod Algorithm find(element)
nextNode header
while nextNode != null and nextNode.element != element
do
// sonraki elemana (düğüm) git
nextNode nextNode‐‐>nextElement
end while
// yukarıdaki döngü eleman bulunduğunda veya liste tamamen
//tarandığı halde eleman bulunamadığında sonlanır
If nextNode != null If nextNode != null
return nextNodeelement
else
// bir sonraki bileşen (düğüm) bulunulamıyor ise ELSE bloğuna girilir.
return nullJava-Bağlı Listede Silme Yapısı public Dugum sil(int anahtar)
{
// Verilen anahtar değerindeki düğümü siler
Dugum etkin = bas;
Dugum onceki = bas;
while(etkin.veri!=anahtar)
{
if(etkin.sonraki==null) return null;
else { onceki = etkin; etkin = etkin.sonraki; }
}
if(etkin==bas) bas = bas.sonraki;
else onceki.sonraki = etkin.sonraki;
return etkin;
}
Yığın(Stack) Yapısı
- Son giren ilk çıkar (Last In First Out-LIFO) veya İlk giren son çıkar (First-in-Last-out FILO) mantığıyla çalışır.
- Eleman ekleme çıkarmaların en üstten (top) yapıldığı veri yapısına yığıt (stack) adı verilir. Bir eleman ekleneceğinde yığıtın en üstüne konulur.
- Bir eleman çıkarılacağı zaman yığıtın en üstündeki eleman çıkarılır.
empty stack: Boş yığıt
push (koy):Yığıta eleman ekleme
pop (al):Yığıttan eleman çıkarma
Örnek kullanım yerleri
-Yazılım uygulamalarındaki Undo işlemleri stack ile yapılır. Undo işlemi için LIFO yapısı kullanılır.
-Web browser’lardaki Back butonu (önceki sayfaya) stack kullanır. Buradada LIFO yapısı kullanılır.
- Matematiksel işlemlerdeki operatörler (+,*,/,- gibi) ve operandlar için stack kullanılabilir.
Kuyruk Yapısı(Queue)
Kuyruklar, eleman eklemelerinin sondan (rear) ve eleman çıkarmalarının baştan (front) yapıldığı doğrusal veri yapılarıdır.
Bir eleman ekleneceği zaman kuyruğun sonuna eklenir. Bir eleman çıkarılacağı zaman kuyrukta bulunan ilk eleman çıkarılır.
Bu nedenle kuyruklara FIFO (First In First Out-İlk giren ilk çıkar) veya LILO (Last-in-Last-out-Son giren son çıkar) listeleri de denilmektedir.
Gerçek yaşamda banklarda, duraklarda, otoyollarda kuyruklar oluşmaktadır. Kuyruğu ilk olarak girenler işlemlerini ilk olarak tamamlayıp kuyruktan çıkarlar. İşletim sistemleri bünyesinde öncelik kuyruğu, yazıcı kuyruğu gibi birçok uygulama alanı vardır. Kuyruk modeli, program tasarımında birçok yerde kullanılır. Örneğin, iki birimi arasında iletişim kanalı, ara bellek/tampon bellek oluşturmada bu modele başvurulur.
Öncelikli Kuyruklar (Priority Queues)
Öncelikli kuyruk uygulamasında kuyruğa girecek verilerin veya nesnelerin birer öncelik değeri vardır ve ekleme bu öncelik değerine bakılarak yapılır. Eğer eklenecek verinin önceliği en küçük ise, yani en önceliksiz ise, doğrudan kuyruğun sonuna eklenir; diğer durumlarda kuyruk üzerinde arama yapılarak kendi önceliği içerisinde sona eklenir.
Kuyruk (queue) yapısının bağlantılı liste ile gerçekleştirimi Queue.java // daha önce verilmişti LinkedListQueue.java
public class LinkedListQueue implements Queue
{
private Node front, back; // kuyruk başı ve sonu
public LinkedListQueue() // kurucu sınıf
{ clear(); }
public boolean empty() // kuyruk boş mu test eder
{ return front==null; }
public T getFront() // kuyruğun önündeki elemanı ver (silme)
{ if (empty()) return null;
return front.data;
}
Ağaç Yapısı(Tree)
Ağaç, bir kök işaretçisi, sonlu sayıda düğümleri ve onları birbirine bağlayan dalları olan bir veri modelidir; aynı aile soyağacında olduğu gibi hiyerarşik bir yapısı vardır ve orada geçen birçok kavram buradaki ağaç veri modelinde de tanımlıdır. Örneğin çocuk, kardeş düğüm, aile, ata gibi birçok kavram ağaç veri modelinde de kullanılır. Genel olarak, veri, ağacın düğümlerinde tutulur; dallarda ise geçiş koşulları vardır denilebilir. Her biri değişik bir uygulamaya doğal çözüm olan ikili ağaç, kodlama ağacı, sözlük ağacı, kümeleme ağacı gibi çeşitli ağaç şekilleri vardır; üstelik uygulamaya yönelik özel ağaç şekilleri de çıkarılabilir.
Bağlı listeler, yığıtlar ve kuyruklar doğrusal (linear) veri yapılarıdır. Ağaçlar ise doğrusal olmayan belirli niteliklere sahip iki boyutlu veri yapılarıdır.
- Arama işlemi bağlı dizilere göre çok hızlı yapılır.
- Ağaçlar hiyerarşik ilişkileri göstermek için kullanılır.
- Her ağaç node’lar ve kenarlardan (edge) oluşur.
- Herbir node(düğüm) bir nesneyi gösterir.
- Herbir kenar (bağlantı) iki node arasındaki ilişkiyi gösterir.
- Ağacın en üstteki düğümüne kök (root) adı verilir.
Kaynak:
YMT219 Veri yapıları — Yrd.Doç.Dr.Erkan Tanyıldızı