Generic Yığın
Coddy'nin C Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 60 / 61.
Görev
KolayBir 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: Üç üyeliStackyapısını (struct) tanımlayın: öğeler için birvoid**dizisi, üst dizin (bir sonraki boş yuva) için birintve kapasite için birint. 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ürpush— yer varsa (top kapasiteden küçükse) en üste bir öğe eklerpop— en üstteki öğeyi çıkarır ve döndürür veya yığın boşsaNULLdöndürürpeek— en üstteki öğeyi çıkarmadan döndürür veya boşsaNULLdöndürüris_empty— yığında öğe yoksa 1, aksi takdirde 0 döndürürfree_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 edilenpush,popveyapeek. 10 kapasiteli bir yığın oluşturun.pushiçin, yığında (heap) bir tam sayı tahsis edin ve onun işaretçisini push edin.popiçin, öğeyi alın, değerini yazdırın ve tam sayıyı serbest bırakın.peekiçin, değeri çıkarmadan yazdırın. Boş bir yığındapopveyapeekçağrılırsa,emptyyazdırın. Tüm işlemlerden sonra, kalan öğeleri ve yığını serbest bırakın.
Programınız şunları alacaktır:
- İşlem sayısı
- Her işlem ayrı bir satırda (
push X,popveyapeek)
Girdiler 5, ardından push 10, push 20, peek, pop, pop olduğunda örnek çıktı:
20
20
10Girdiler 3, ardından pop, push 42, peek olduğunda örnek çıktı:
empty
42Girdiler 4, ardından push 5, push 15, pop, pop olduğunda örnek çıktı:
15
5Yığı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
1Modüler Programlama Temelleri
Başlık DosyalarıInclude Guard'larKaynak DosyalarıStatik FonksiyonlarÖzet: Modüler Hesap Makinesi4Kapsülleme
Opaque Pointer KavramıOpaque Struct TanımlamaGetter ve Setter MetotlarıSetter Metotlarında DoğrulamaÖzet: Gizli Kutu2Nesneler ve Metotlar
Nesne Olarak Struct'lar'Self' İşaretçisiConst Doğruluğuİşaretçi vs DeğerYardımcı MetotlarÖzet: Point Manager5Proje: Basit Banka Hesabı
Proje KurulumuHesabın Oluşturulması3Nesne Yaşam Döngüsü
Constructor DeseniDestructor DeseniStack İlklendirmeDerin KopyalamaÖzet: String Wrapper6Kompozisyon Yoluyla Kalıtım
Struct Gömmeİlk Üye KuralıÜst Üyelere ErişimUpcastingÖzet: Şekil Hiyerarşisi