Yigin & Kuyruk 0 {\ /\ Suhap SAHIN Onur GÖK
Yıgın (Stack) son giren ilk çıkan LIFO ilk giren son çıkan
Yıgın islemleri(so) ekle push 31 stack overflow 24 31 U U 34 34 3 3 S S
Yıgın islemleri(so) al pop 31 stack underflow U 34 3 S
Yıgın islemleri(so) SP 31 U dolumu isfull 34 3 S
Yıgın islemleri(so) bosmu isempty SP
Yıgın islemleri(so) ekle(), push() al(), pop() O(1) bosmu(), isempty() dolumu(), isfull()
Yıgın Uygulamaları Sembollerin esitlenmesi #include <stdio.h> int main () { for(int i=0;i<10;i++){ // Kod
Yıgın Uygulamaları Son-ek(Posfix)/Ön-ek(Prefix) ifadeleri a op1 b op2 c op3 d op1 = + op2 = * op3 = +
Yıgın Uygulamaları Bir çok programdaki ileri-al, geri-al (redo-undo) ve ileri-git, geri-git (forward-backward) özellikleri
Yıgın Uygulamaları Tower of Hanoi, tree traversals
Yıgın Uygulamaları Backtracking, Knight tour problem, rat in a maze, sudoku solver
Yıgın isaretcisi (SP) ekle(3); ekle(2); al( ); al( ); SP SP SP 3 2 3 SP 3 SP 9 9 9 9 9 7 7 7 7 7 5 5 5 5 5 4 4 4 4 4 11 11 11 11 11
Yıgın Gerçeklestirimi int dizi[10]={35,33,42,10,14,19,27,44,26,31; Dizi 0 1 2 3 4 5 6 7 8 9 35 33 42 10 14 19 27 44 26 31 Baglantılı Listeler veri Sonraki veri Sonraki veri Sonraki 7 NULL
Yıgın(Dizi) & C struct Yigin { int SP; unsigned kapasite; int* dizi; ; Yigin kapasite SP *dizi
Yıgın(Dizi) & C struct Yigin* yiginolustur(unsigned kapasite) { struct Yigin* yigin = (struct Yigin*) malloc(sizeof(struct Yigin)); yigin->kapasite = kapasite; yigin->sp = -1; yigin->dizi = (int*) malloc(yigin->kapasite * sizeof(int)); return yigin; yigin kapasite kapasite-1 *dizi kapasite 1 0 SP=-1
Yıgın(Dizi) & C struct Yigin* yiginolustur(unsigned kapasite) { struct Yigin* yigin = (struct Yigin*) malloc(sizeof(struct Yigin)); yigin->kapasite = kapasite; yigin->sp = -1; yigin->dizi = (int*) malloc(yigin->kapasite * sizeof(int)); return yigin; 99 98. struct Yigin* yigin = yiginolustur(100); 1 0 SP = -1
Yıgın(Dizi) & C SP = 99 99 int dolumu(struct Yigin* yigin) { return yigin->sp == yigin->kapasite - 1; 98. 1 0
Yıgın(Dizi) & C 99 int bosmu(struct Yigin* yigin) { return yigin->sp == -1; 98. 1 0 SP = -1
Yıgın(Dizi) & C void ekle(struct Yigin* yigin, int veri) { if (dolumu(yigin)) return; yigin->dizi[++yigin->sp] = veri; printf("%d Yigina eklendi\n", veri); ekle(yigin, 10); veri SP = 2 SP = 1 99 98. 1 0
Yıgın(Dizi) & C int al(struct Yigin* yigin) { if (bosmu(yigin)) return INT_MIN; return yigin->dizi[yigin->sp--]; al(yigin); SP = 2 SP = 1 99 98. veri 1 0
Yıgın(Dizi) & C int main() { struct Yigin* yigin = yiginolustur(100); ekle(yigin, 10); ekle(yigin, 20); ekle(yigin, 30); printf("yiginda %d alindi\n", al(yigin)); printf("yiginda %d alindi\n", al(yigin)); printf("yiginda %d alindi\n", al(yigin)); printf("yiginda %d alindi\n", al(yigin)); return 0; SP = 0 SP = -1 99 98. 30 20 1 10 0
Yıgın(Dizi) & C int main() { struct Yigin* yigin = yiginolustur(100); ekle(yigin, 10); ekle(yigin, 20); ekle(yigin, 30); printf("yiginda %d alindi\n", al(yigin)); printf("yiginda %d alindi\n", al(yigin)); printf("yiginda %d alindi\n", al(yigin)); printf("yiginda %d alindi\n", al(yigin)); return 0; SP = 1 SP = 0 SP = -1 99 98. 30 20 1 10 0
Yıgın(Dizi) & C int main() { struct Yigin* yigin = yiginolustur(100); ekle(yigin, 10); ekle(yigin, 20); ekle(yigin, 30); printf("yiginda %d alindi\n", al(yigin)); printf("yiginda %d alindi\n", al(yigin)); printf("yiginda %d alindi\n", al(yigin)); printf("yiginda %d alindi\n", al(yigin)); return 0; SP = 2 SP = 1 SP = 0 SP = -1 99 98. 30 20 1 10 0
Yıgın(Dizi) & C int main() { struct Yigin* yigin = yiginolustur(100); ekle(yigin, 10); ekle(yigin, 20); ekle(yigin, 30); printf("yiginda %d alindi\n", al(yigin)); printf("yiginda %d alindi\n", al(yigin)); printf("yiginda %d alindi\n", al(yigin)); printf("yiginda %d alindi\n", al(yigin)); return 0; SP = 2 SP = 1 SP = 0 SP = -1 99 98. 30 20 1 10 0
Yıgın(Dizi) & Java class Yigin { static final int kapasite = 1000; int SP; int dizi[] = new int[kapasite]; boolean isempty() { return (SP < 0); Yigin() { SP = -1; SP = -1 999 998. 1 0
Yıgın(Dizi) & Java 99 boolean ekle(int x){ if (SP >= kapasite){ System.out.println("Stack Overflow"); return false; else{ dizi[++sp] = x; return true; x SP = 2 SP = 1 98. 1 0
Yıgın(Dizi) & Java int al(){ if (SP < 0){ System.out.println("Stack Underflow"); return 0; else{ int x = dizi[sp--]; return x; SP = 2 SP = 1 99 98. x 1 0
Yıgın(Dizi) & Java class Main { public static void main(string args[]) { Yigin s = new Yigin(); s.ekle(10); s.ekle(20); s.ekle(30); System.out.println(s.al() + " elemanı yigindan alindi"); SP = 2 SP = 1 SP = 0 SP = -1 99 98. 30 20 1 10 0
Yıgın(Dizi) & Java class Main { public static void main(string args[]) { Yigin s = new Yigin(); s.ekle(10); s.ekle(20); s.ekle(30); System.out.println(s.al() + " elemanı yigindan alindi"); SP = 2 SP = 1 99 98. 30 20 1 10 0
Yıgın(Baglı Liste) & C struct YiginDugum { int veri; struct YiginDugum* sonraki; ; YiginDugum veri *sonraki
Yıgın(Baglı Liste) & C struct YiginDugum* YeniDugum(int veri) { struct YiginDugum* yigindugum = (struct YiginDugum*) malloc(sizeof(struct YiginDugum)); yigindugum->veri = veri; yigindugum->sonraki = NULL; return yigindugum; *yigindugum veri NULL
Yıgın(Baglı Liste) & C struct YiginDugum* kok = NULL; *kok NULL
Yıgın(Baglı Liste) & C void ekle(struct YiginDugum** kok, int veri) { struct YiginDugum* yigindugum = YeniDugum(veri); yigindugum->sonraki = *kok; *kok = yigindugum; printf("%d verisine sahip dugum eklendi\n", veri); ekle(&kok, 10); *yigin dugum *kok 10 NULL
Yıgın(Baglı Liste) & C void ekle(struct YiginDugum** kok, int veri) { struct YiginDugum* yigindugum = YeniDugum(veri); yigindugum->sonraki = *kok; *kok = yigindugum; printf("%d verisine sahip dugum eklendi\n", veri); ekle(&kok, 10); *yigin dugum *kok 10 NULL
Yıgın(Baglı Liste) & C void ekle(struct YiginDugum** kok, int veri) { struct YiginDugum* yigindugum = YeniDugum(veri); yigindugum->sonraki = *kok; *kok = yigindugum; printf("%d verisine sahip dugum eklendi\n", veri); ekle(&kok, 10); ekle(&kok, 20); *yigin dugum *kok 20 10 NULL
Yıgın(Baglı Liste) & C void ekle(struct YiginDugum** kok, int veri) { struct YiginDugum* yigindugum = YeniDugum(veri); yigindugum->sonraki = *kok; *kok = yigindugum; printf("%d verisine sahip dugum eklendi\n", veri); ekle(&kok, 10); ekle(&kok, 20); *yigin dugum *kok 20 10 NULL
Yıgın(Baglı Liste) & C void ekle(struct YiginDugum** kok, int veri) { struct YiginDugum* yigindugum = YeniDugum(veri); yigindugum->sonraki = *kok; *kok = yigindugum; printf("%d verisine sahip dugum eklendi\n", veri); ekle(&kok, 10); ekle(&kok, 20); ekle(&kok, 30); *yigin dugum *kok 30 20 10 NULL
Yıgın(Baglı Liste) & C void ekle(struct YiginDugum** kok, int veri) { struct YiginDugum* yigindugum = YeniDugum(veri); yigindugum->sonraki = *kok; *kok = yigindugum; printf("%d verisine sahip dugum eklendi\n", veri); ekle(&kok, 10); ekle(&kok, 20); ekle(&kok, 30); *yigin dugum *kok 30 20 10 NULL
Yıgın(Baglı Liste) & C int bosmu(struct YiginDugum *kok) { return!kok; *kok veri NULL
Yıgın(Baglı Liste) & C int al(struct YiginDugum** kok) { if (bosmu(*kok)) return INT_MIN; struct YiginDugum* alinacak = *kok; *kok = (*kok)->sonraki; int alinan = alinacak->veri; free(alinacak); return alinan; al(&kok) *alinacak *kok 30 20 10 NULL
Yıgın(Baglı Liste) & C int al(struct YiginDugum** kok) { if (bosmu(*kok)) return INT_MIN; struct YiginDugum* alinacak = *kok; *kok = (*kok)->sonraki; int alinan = alinacak->veri; free(alinacak); return alinan; al(&kok) *alinacak *kok 30 20 10 NULL
Labirent Fare 1 0 0 0 1 1 1 1 0 1 0 0 1 1 1 1 Peynir SP = 3 16 15 3 Sag 2 Asagı 1 Basla 0
Labirent Fare 1 0 0 0 1 1 1 1 0 1 0 0 1 1 1 1 Peynir SP = 3 16 15 Sag 3 Sag 2 Asagı 1 Basla 0
Labirent Fare 1 0 0 0 1 1 1 1 0 1 0 0 1 1 1 1 Peynir SP = 3 16 15 Sag Sag 3 Sag 2 Asagı 1 Basla 0
Labirent Fare 1 0 0 0 1 1 1 1 0 1 0 0 1 1 1 1 Peynir SP = 3 16 15 Sag 3 Sag 2 Asagı 1 Basla 0
Labirent Fare 1 0 0 0 1 1 1 1 0 1 0 0 1 1 1 1 Peynir SP = 3 16 15 3 Sag 2 Asagı 1 Basla 0
Labirent Fare 1 0 0 0 1 1 1 1 0 1 0 0 1 1 1 1 Peynir SP = 3 16 15 Asagı 3 Sag 2 Asagı 1 Basla 0
Labirent Fare 1 0 0 0 1 1 0 1 0 1 0 0 1 1 1 1 Peynir
Kuyruk Her iki ucu açık Bir uçtan veri (enqueue) ekleme Diger uçtan veri (dequeue) çıkarma First-In-First-Out
Gösterim
Kuyruk Operasyonları enqueue(): Sona elemanı ekler dequeue(): En öndeki elemanı çıkartır isfull(): Kuyruk dolu mu? isempty(): Kuyruk bos mu?
Kuyruk Gerçeklestirimi int dizi[10]={35,33,42,10,14,19,27,44,26,31; Dizi 0 1 2 3 4 5 6 7 8 9 35 33 42 10 14 19 27 44 26 31 Baglantılı Listeler veri Sonraki veri Sonraki veri Sonraki 7 NULL
Kuyruk Gerçeklestirimi #define kapasite 6 int intarray[kapasite]; int on = 0; int arka = 0; int eleman_sayisi=0; 0 1 2 3 4 5 intarray 6 on = 0 arka = 0 eleman_sayisi = 0
Kuyruk Gerçeklestirimi 0 1 2 3 4 5 bool bos_mu(){ return eleman_sayisi==0; intarray eleman_sayisi = 0
Kuyruk Gerçeklestirimi 0 1 2 3 4 5 bool dolumu(){ return eleman_sayisi==kapasite; intarray 3 5 9 1 12 15 eleman_sayisi = 6
Kuyruk Gerçeklestirimi int ekle(int veri){ if(dolumu()) { printf("kuyruk dolu!\n"); return 0; intarray[arka]= veri; arka++; if(arka==kapasite) arka=0; eleman_sayisi++; return 1; ekle(3); ekle(5); ekle(9); ekle(1); ekle(12); intarray 3 0 1 2 3 4 5 on = 0 arka = 0 eleman_sayisi = 0
Kuyruk Gerçeklestirimi int ekle(int veri){ if(dolumu()) { printf("kuyruk dolu!\n"); return 0; intarray[arka]= veri; arka++; if(arka==kapasite) arka=0; eleman_sayisi++; return 1; ekle(3); ekle(5); ekle(9); ekle(1); ekle(12); intarray 3 0 1 2 3 4 5 on = 0 arka = 1 eleman_sayisi = 0
Kuyruk Gerçeklestirimi int ekle(int veri){ if(dolumu()) { printf("kuyruk dolu!\n"); return 0; intarray[arka]= veri; arka++; if(arka==kapasite) arka=0; eleman_sayisi++; return 1; ekle(3); ekle(5); ekle(9); ekle(1); ekle(12); intarray 3 0 1 2 3 4 5 on = 0 arka = 1 eleman_sayisi = 1
Kuyruk Gerçeklestirimi int ekle(int veri){ if(dolumu()) { printf("kuyruk dolu!\n"); return 0; intarray[arka]= veri; arka++; if(arka==kapasite) arka=0; eleman_sayisi++; return 1; ekle(3); ekle(5); ekle(9); ekle(1); ekle(12); intarray 3 5 0 1 2 3 4 5 on = 0 arka = 1 eleman_sayisi = 1
Kuyruk Gerçeklestirimi int ekle(int veri){ if(dolumu()) { printf("kuyruk dolu!\n"); return 0; intarray[arka]= veri; arka++; if(arka==kapasite) arka=0; eleman_sayisi++; return 1; ekle(3); ekle(5); ekle(9); ekle(1); ekle(12); intarray 3 5 0 1 2 3 4 5 on = 0 arka = 2 eleman_sayisi = 2
Kuyruk Gerçeklestirimi int ekle(int veri){ if(dolumu()) { printf("kuyruk dolu!\n"); return 0; intarray[arka]= veri; arka++; if(arka==kapasite) arka=0; eleman_sayisi++; return 1; ekle(3); ekle(5); ekle(9); ekle(1); ekle(12); ekle(15); 0 1 2 3 4 5 intarray 3 5 9 1 12 15 on = 0 arka = 6 eleman_sayisi = 6
Kuyruk Gerçeklestirimi int cikar(){ if(bos_mu()){ printf("kuyruk boş!"); return 0; int data = intarray[on]; on++; if(on==kapasite) on=0; eleman_sayisi--; return data; cikar( ); cikar( ); ekle(9); ekle(1); ekle(12); ekle(15); 0 1 2 3 4 5 intarray 3 5 9 1 12 15 on = 0 arka = 6 eleman_sayisi = 6
Kuyruk Gerçeklestirimi int cikar(){ if(bos_mu()){ printf("kuyruk boş!"); return 0; int data = intarray[on]; on++; if(on==kapasite) on=0; eleman_sayisi--; return data; cikar( ); cikar( ); ekle(9); ekle(1); ekle(12); ekle(15); 0 1 2 3 4 5 intarray 3 5 9 1 12 15 on = 1 arka = 6 eleman_sayisi = 5
Kuyruk(Baglı Liste) struct KuyrukDugumu { int veri; struct KuyrukDugumu * sonraki; ; KuyrukDugumu veri *sonraki
Kuyruk(Baglı Liste) class Kuyruk { private: KuyrukDugumu * ilk; KuyrukDugumu * son; int _sayi; public: Kuyruk() { this->_sayi = 0; this->ilk = this->son = NULL; void ekle(int veri); int al(); int sayi() { return this->_sayi; ; Kuyruk *k = new Kuyruk(); *son NULL sayi = 0 *ilk NULL
Kuyruk(Baglı Liste) void Kuyruk::ekle(int veri) { // bagli listede sona ekleme islemi KuyrukDugumu *k = new KuyrukDugumu(); k->veri = veri; k->sonraki = NULL; k->ekle(1); k->ekle(2); k->ekle(3); if (this->ilk == NULL) { this->ilk = this->son = k; else { this->son->sonraki = k; this->son = k; *k *son sayi = 0 *ilk this->_sayi++; 1 NULL NULL NULL
Kuyruk(Baglı Liste) void Kuyruk::ekle(int veri) { // bagli listede sona ekleme islemi KuyrukDugumu *k = new KuyrukDugumu(); k->veri = veri; k->sonraki = NULL; k->ekle(1); k->ekle(2); k->ekle(3); if (this->ilk == NULL) { this->ilk = this->son = k; else { this->son->sonraki = k; this->son = k; *ilk *k *son sayi = 1 this->_sayi++; 1 NULL
Kuyruk(Baglı Liste) void Kuyruk::ekle(int veri) { // bagli listede sona ekleme islemi KuyrukDugumu *k = new KuyrukDugumu(); k->veri = veri; k->sonraki = NULL; k->ekle(1); k->ekle(2); k->ekle(3); if (this->ilk == NULL) { this->ilk = this->son = k; else { this->son->sonraki = k; this->son = k; *ilk *son sayi = 1 *k this->_sayi++; 1 2 NULL
Kuyruk(Baglı Liste) void Kuyruk::ekle(int veri) { // bagli listede sona ekleme islemi KuyrukDugumu *k = new KuyrukDugumu(); k->veri = veri; k->sonraki = NULL; k->ekle(1); k->ekle(2); k->ekle(3); if (this->ilk == NULL) { this->ilk = this->son = k; else { this->son->sonraki = k; this->son = k; *ilk *son sayi = 2 *k this->_sayi++; 1 2 NULL
Kuyruk(Baglı Liste) int Kuyruk::al( ) { assert( this->sayi()!= 0 ); // eleman yoksa hata ver int veri = this->ilk->veri; // bagli listede bastan silme islemi KuyrukDugumu * silinecek = this->ilk; this->ilk = this->ilk->sonraki; delete silinecek; k->al( ); k->ekle(2); k->ekle(3); *silinecek sayi = 2 this->_sayi--; return veri; *ilk 1 2 NULL
Kuyruk(Baglı Liste) int Kuyruk::al( ) { assert( this->sayi()!= 0 ); // eleman yoksa hata ver int veri = this->ilk->veri; // bagli listede bastan silme islemi KuyrukDugumu * silinecek = this->ilk; this->ilk = this->ilk->sonraki; delete silinecek; k->al( ); k->ekle(2); k->ekle(3); *silinecek sayi = 1 this->_sayi--; return veri; *ilk 1 2 NULL
Sorular