Jump to content
  • entries
    33
  • comments
    0
  • views
    1,227

Basit Dizi Tabanlı Yığın Uygulaması


Doğuhan ELMA

65 views

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.

Guest
Add a comment...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...