Basit Dizi Tabanlı Yığın Uygulaması
Yığın (stack) veri yapısının bir dizi (array) kullanılarak basit bir uygulamasıdır. Bu yaklaşım, yığın işlemlerinin (push, pop, peek/top vb.) bir dizi üzerinde yürütülmesi mantığına dayanır.
Array-Based Stack Implementation'ın avantajları, dizilerin ardışık bellek bloklarında depolanmasından ve sabit zamanlı indeks erişimi sağlamasından kaynaklanır. Bununla birlikte, dizi boyutunun sabit olması nedeniyle, yığının kapasitesi de sabittir ve dolu bir yığına eklemeler hata durumlarına yol açabilir.
Örnek Uygulama:
Aşağıda, Python'da basit bir array-based stack uygulamasının örneği verilmiştir:
class ArrayStack: def __init__(self, capacity): self.data = [None] * capacity self.size = 0 def push(self, value): if self.size == len(self.data): raise Exception("Stack is full") self.data[self.size] = value self.size += 1 def pop(self): if self.size == 0: raise Exception("Stack is empty") value = self.data[self.size - 1] self.data[self.size - 1] = None self.size -= 1 return value def peek(self): if self.size == 0: raise Exception("Stack is empty") return self.data[self.size - 1] def is_empty(self): return self.size == 0
Bu sınıf, yığının kapasitesini belirleyen bir capacity parametresi alarak başlatılır ve bu kapasite boyunca bir dizi oluşturur. Dizi, yığının öğelerini depolar.
push: Yığının dolup dolmadığını kontrol eder ve yeni bir öğeyi ekler.
pop: Yığının boş olup olmadığını kontrol eder ve en üst öğeyi çıkarır.
peek: Yığının en üstündeki öğeyi döndürür, ancak yığından çıkarmaz.
is_empty: Yığının boş olup olmadığını kontrol eder.
Bu basit uygulama, dizilerin ardışık hafıza kullanımının ve hızlı indeks erişiminin avantajlarından yararlanır, ancak sabit boyutlu olması dezavantajıyla birlikte gelir. Daha karmaşık uygulamalarda, dinamik olarak yeniden boyutlandırma gibi ek özellikler eklemek mümkündür.
Markup dilleri (örneğin HTML, XML), içeriği biçimlendirmek ve yapılandırmak için etiketler (tags) kullanır. Etiketler genellikle açılış etiketi <tag> ve kapanış etiketi </tag> şeklinde çiftler halinde gelir. Bu etiketlerin düzgün bir şekilde eşleşmesi ve iç içe gelmesi, belgenin düzgün bir yapıya sahip olmasını sağlar.
Matching Tags:
Eşleşen etiketler, her açılış etiketinin bir karşılık gelen kapanış etiketi ile eşleştiği bir yapıdır. Bu eşleşme, belgenin anlamlı ve geçerli olmasını sağlar.
Örneğin, HTML'de:
<p><b>Yazı</b></p>
Bu durumda, <b> etiketi </b> ile, <p> etiketi ise </p> ile eşleşir.
Eşleşmeyen Etiketler:
Eşleşmeyen veya düzensiz etiketler, belgede bir hata veya yapısal bir problem olduğunu gösterir.
Örneğin:
<p><b>Yazı</p></b>
Bu örnekte, etiketler düzgün iç içe girmediğinden, belge geçerli değildir.
Etiketlerin Eşleşmesini Kontrol Etme:
Etiketlerin düzgün eşleşip eşleşmediğini kontrol etmek, yapısal hataları tespit etmek ve düzeltmek için önemlidir. Bu genellikle bir yığın veri yapısı kullanılarak yapılır.
Belge okunurken, her açılış etiketi yığına eklenir.
Bir kapanış etiketi görüldüğünde, yığının en üstündeki etiketle eşleşip eşleşmediği kontrol edilir.
Eşleşirse, açılış etiketi yığından çıkarılır.
Belge sonuna gelindiğinde, yığının boş olması gerekir. Eğer boş değilse, bazı açılış etiketleri eşleşmemiş demektir.
Bu algoritma, etiketlerin düzgün bir şekilde iç içe girmesini ve eşleşmesini sağlar, böylece belgenin yapısal bütünlüğünü korur.
Özetle, etiketlerin eşleşmesi, markup dillerinde düzenli ve anlamlı bir yapı oluşturur, ve bu eşleşmeyi kontrol etmek, belge hatalarını tespit etmeye yardımcı olur.
Markup dillerindeki etiketlerin düzgün bir şekilde eşleşip eşleşmediğini kontrol etmek için kullanılabilecek basit bir Python örneği aşağıda verilmiştir:
from collections import deque def is_matching(opening_tag, closing_tag): # Açılış etiketi ve kapanış etiketi eşleşiyorsa True döner return (opening_tag == '<p>' and closing_tag == '</p>') or \ (opening_tag == '<b>' and closing_tag == '</b>') def check_tags(text): stack = deque() # Belge içindeki etiketleri ayrıştırır tags = [tag for tag in text.split() if tag.startswith('<') and tag.endswith('>')] for tag in tags: # Açılış etiketi ise yığına ekler if not tag.startswith('</'): stack.append(tag) else: # Kapanış etiketi ise yığından en son eklenen açılış etiketi alınır ve eşleşip eşleşmediği kontrol edilir if not stack or not is_matching(stack.pop(), tag): return False # Yığının boş olması, tüm etiketlerin eşleştiği anlamına gelir return not stack text = "<p><b>Yazı</b></p>" if check_tags(text): print("Etiketler düzgün eşleşiyor.") else: print("Etiketler düzgün eşleşmiyor.")
Bu örnek, sadece <p> ve <b> etiketleri için çalışır, ancak daha karmaşık bir analiz ve eşleştirme için genişletilebilir.
Yukarıdaki kod, belirtilen metindeki etiketlerin düzgün eşleşip eşleşmediğini kontrol eder. Etiketler düzgün eşleşirse, "Etiketler düzgün eşleşiyor." çıktısını üretir. Eğer etiketler düzgün eşleşmiyorsa, "Etiketler düzgün eşleşmiyor." çıktısını üretir.
Not:
deque (çift yönlü sıra), Python'un collections modülünde bulunan bir veri yapısıdır. Bu veri yapısı, her iki ucunda da veri eklemeyi ve çıkarmayı hızlı bir şekilde yapmayı sağlar. deque kullanımı, listelere kıyasla büyük performans avantajları sunabilir, özellikle de listenin başında ve sonunda işlemler yaparken.
stack = deque() ifadesi, boş bir deque nesnesi oluşturur, ve bu stack adlı değişkene atanır. Bu durumda, deque'u bir yığın (stack) olarak kullanıyoruz. Yığınlar, son giren ilk çıkar (Last In, First Out - LIFO) ilkesine göre çalışan bir veri yapısıdır.
Yığın (stack) işlemleri için append metodu eleman eklemek (yığının üstüne koymak), pop metodu ise en üstteki elemanı çıkarmak (yığının üstünden almak) için kullanılır.
from collections import deque stack = deque() stack.append(5) # Yığının üstüne 5 ekler stack.append(10) # Yığının üstüne 10 ekler top_element = stack.pop() # En üstteki elemanı alır (10)
Bu yığın mekanizması, etiket eşleştirme örneğinde, açılan etiketleri takip etmek ve uygun bir şekilde eşleşip eşleşmediğini kontrol etmek için kullanılabilir.
0 Comments
Recommended Comments
There are no comments to display.