Generic Yığın
Coddy'nin C Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 60 / 61.
Görev
KolayBir 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 sahipStackyapısını tanımlayın: öğeler için birvoid**dizisi, üst indeks (bir sonraki boş yuva) için birintve kapasite için birint. 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ürpush: yer varsa (top capacity değerinden küçük olduğunda) üst tarafa bir öğe eklerpop: üstteki öğeyi çıkarıp döndürür veya yığın boşsaNULLdöndürürpeek: üstteki öğeyi çıkarmadan döndürür veya boşsaNULLdöndürüris_empty: yığında hiç öğe yoksa 1, aksi takdirde 0 döndürürfree_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 gelenpush,popveyapeek. Kapasitesi 10 olan bir yığın oluşturun.pushiçin heap üzerinde bir tamsayı ayırın ve işaretçisini yığına ekleyin.popiçin öğeyi alın, değerini yazdırın ve tamsayıyı serbest bırakın.peekiçin öğeyi çıkarmadan değerini yazdırın. Boş bir yığın üzerindepopveyapeekçağrılırsaemptyyazdırın. Tüm işlemlerden sonra kalan öğeleri ve yığını serbest bırakın.
Programınız şunları alacak:
- İş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 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
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şisiKendi başına pratik yap: Online C derleyicisi