Menu
Coddy logo textTech

Generic Yığın

Coddy'nin C Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 60 / 61.

challenge icon

Görev

Kolay

Bir yığın, Son Giren İlk Çıkar (LIFO) ilkesini izleyen temel bir veri yapısıdır: eklenen son öğe, çıkarılan ilk öğedir. Bir tabak yığını düşünün: üstten ekler ve üstten çıkarırsınız.

Bir Genel Yığın oluşturalım: void* işaretçilerini kullanarak her tür veriyi depolayabilen çok yönlü bir veri yapısı. Yığınınız, tüm temel işlemlerle birlikte Son Giren İlk Çıkar ilkesini izleyecek.

Kodunuzu üç dosyada düzenleyeceksiniz:

  • stack.h: Üç üyeye sahip Stack yapısını tanımlayın: öğeler için bir void** dizisi, üst indeks (bir sonraki boş yuva) için bir int ve kapasite için bir int. Yığın oluşturma (bir kapasite alır), öğe ekleme, öğe çıkarma, üstteki öğeye bakma, yığının boş olup olmadığını denetleme ve yığını serbest bırakma işlev prototiplerini bildirin.
  • stack.c: Genel yığınınızı uygulayın:
    • create_stack: heap üzerinde bir Stack ayırır, verilen kapasiteyle items dizisini ayırır, top değerini 0 olarak başlatır ve işaretçiyi döndürür
    • push: yer varsa (top capacity değerinden küçük olduğunda) üst tarafa bir öğe ekler
    • pop: üstteki öğeyi çıkarıp döndürür veya yığın boşsa NULL döndürür
    • peek: üstteki öğeyi çıkarmadan döndürür veya boşsa NULL döndürür
    • is_empty: yığında hiç öğe yoksa 1, aksi takdirde 0 döndürür
    • free_stack: önce items 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: sonrasında bir tamsayı değeri gelen push, pop veya peek. Kapasitesi 10 olan bir yığın oluşturun. push için heap üzerinde bir tamsayı ayırın ve işaretçisini yığına ekleyin. pop için öğeyi alın, değerini yazdırın ve tamsayıyı serbest bırakın. peek için öğeyi çıkarmadan değerini yazdırın. Boş bir yığın üzerinde 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ı alacak:

  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 depoladığını unutmayın: gerçek veriyi ayırmaktan ve serbest bırakmaktan çağıran sorumludur. Çıkarma sırasında, değere erişmek için döndürülen void* değerini int* türüne dönüştürün. Komut dizelerini karşılaştırmak için strcmp içindeki <string.h> işlevini kullanın.

Kendin dene

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

int main() {
    int n;
    scanf("%d", &n);
    
    // TODO: Kapasitesi 10 olan bir yığın oluştur
    
    // TODO: Her işlemi işle
    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 ve işaretçisini yığına ekle
        }
        else if (strcmp(command, "pop") == 0) {
            // TODO: Öğeyi çıkar
            // - NULL değilse, değeri yazdır ve tamsayıyı serbest bırak
            // - NULL ise (boş yığın), "empty" yazdır
        }
        else if (strcmp(command, "peek") == 0) {
            // TODO: Üstteki öğeye bak
            // - NULL değilse, değeri yazdır (kaldırma veya serbest bırakma)
            // - NULL ise (boş yığın), "empty" yazdır
        }
    }
    
    // TODO: Yığındaki kalan öğeleri serbest bırak
    // TODO: Yığının kendisini serbest bırak
    
    return 0;
}

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online C derleyicisi