Menu
Coddy logo textTech

Generic Yığın

Coddy'nin C Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 60 / 61.

challenge icon

Görev

Kolay

Bir yığın (stack), Son-Giren-İlk-Çıkar (LIFO) prensibini takip eden temel bir veri yapısıdır — eklenen son eleman, çıkarılan ilk elemandır. Bir tabak yığınını düşünün: en üste eklersiniz ve en üstten çıkarırsınız.

Hadi bir Genel Yığın (Generic Stack) inşa edelim — void* işaretçilerini kullanarak her türlü veri tipini saklayabilen çok yönlü bir veri yapısı. Yığınınız, tüm temel operasyonlarla birlikte Son-Giren-İlk-Çıkar prensibini takip edecektir.

Kodunuzu üç dosya halinde düzenleyeceksiniz:

  • stack.h: Üç üyeli Stack yapısını (struct) tanımlayın: öğeler için bir void** dizisi, üst dizin (bir sonraki boş yuva) için bir int ve kapasite için bir int. Bir yığın oluşturma (kapasite alır), bir öğe ekleme (push), bir öğe çıkarma (pop), en üstteki öğeye bakma (peek), yığının boş olup olmadığını kontrol etme ve yığını serbest bırakma (free) işlevleri için fonksiyon prototiplerini bildirin.
  • stack.c: Genel yığınınızı uygulayın:
    • create_stack — yığında (heap) bir Stack tahsis eder, verilen kapasiteyle öğe dizisini tahsis eder, top değerini 0 olarak başlatır ve işaretçiyi döndürür
    • push — yer varsa (top kapasiteden küçükse) en üste bir öğe ekler
    • pop — en üstteki öğeyi çıkarır ve döndürür veya yığın boşsa NULL döndürür
    • peek — en üstteki öğeyi çıkarmadan döndürür veya boşsa NULL döndürür
    • is_empty — yığında öğe yoksa 1, aksi takdirde 0 döndürür
    • free_stack — önce öğe dizisini, ardından Stack yapısının kendisini serbest bırakır
  • main.c: Gerçekleştirilecek işlem sayısını okuyun. Ardından her işlem için bir komut okuyun: bir tam sayı değeriyle takip edilen push, pop veya peek. 10 kapasiteli bir yığın oluşturun. push için, yığında (heap) bir tam sayı tahsis edin ve onun işaretçisini push edin. pop için, öğeyi alın, değerini yazdırın ve tam sayıyı serbest bırakın. peek için, değeri çıkarmadan yazdırın. Boş bir yığında pop veya peek çağrılırsa, empty yazdırın. Tüm işlemlerden sonra, kalan öğeleri ve yığını serbest bırakın.

Programınız şunları alacaktır:

  1. İşlem sayısı
  2. Her işlem ayrı bir satırda (push X, pop veya peek)

Girdiler 5, ardından push 10, push 20, peek, pop, pop olduğunda örnek çıktı:

20
20
10

Girdiler 3, ardından pop, push 42, peek olduğunda örnek çıktı:

empty
42

Girdiler 4, ardından push 5, push 15, pop, pop olduğunda örnek çıktı:

15
5

Yığınınızın void* işaretçilerini sakladığını unutmayın — gerçek veriyi tahsis etmek ve serbest bırakmak çağıranın sorumluluğundadır. Pop yaparken, değere erişmek için döndürülen void* değerini tekrar int* türüne dönüştürün. Komut dizelerini karşılaştırmak için <string.h> kütüphanesinden strcmp kullanın.

Kendin dene

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "stack.h"

int main() {
    int n;
    scanf("%d", &n);
    
    // TODO: 10 kapasiteli bir yığın (stack) oluşturun
    
    // TODO: Her işlemi işleyin
    for (int i = 0; i < n; i++) {
        char command[10];
        scanf("%s", command);
        
        if (strcmp(command, "push") == 0) {
            int value;
            scanf("%d", &value);
            // TODO: Heap üzerinde bir tamsayı ayırın ve işaretçisini yığına ekleyin (push)
        }
        else if (strcmp(command, "pop") == 0) {
            // TODO: Öğeyi yığından çıkarın (pop)
            // - Eğer NULL değilse, değeri yazdırın ve tamsayıyı serbest bırakın (free)
            // - Eğer NULL ise (yığın boşsa), "empty" yazdırın
        }
        else if (strcmp(command, "peek") == 0) {
            // TODO: En üstteki öğeye bakın (peek)
            // - Eğer NULL değilse, değeri yazdırın (çıkarmayın veya serbest bırakmayın)
            // - Eğer NULL ise (yığın boşsa), "empty" yazdırın
        }
    }
    
    // TODO: Yığında kalan tüm öğeleri serbest bırakın
    // TODO: Yığının kendisini serbest bırakın
    
    return 0;
}

Object Oriented Programming bölümündeki tüm dersler