C de Stack Veri Yapısı

C programlama dili uzerinde turden bagimsiz olarak calisacak stack(yigin) veri yapisi tasarimi yapacagiz.

Stack hakkinda konumsak gerekirse; bir programcinin elbet karsisina cikicak bi kelime oldugunu soyleyebilirim..:)

Sistem programciliginda gecici degerlerin saklandigi bellek bolgelerine stack deniyor.Bu bolge derleme asamasinda amac koda derleyici tarafindan, baglama asamasinda ise exe koda linker tarafindan yaziliyor. Ancak W32’de her thread’in stack bolgesi birbirinden izole edilmistir ve farkli buyukluklerde olabilir.

Bu ram bolgesi LIFO(Last In First Out) sistemiyle calisir. Bu sisteme gore, yigina son atilan ilk cikicak olandir. Yuksek seviyeli programlama dilleri, yerel degiskenler ve parametre degiskenleri icin bu alani kullanirlar.

Bizde bu sistemle ayni mantikla calisan bir veri yapisi tasarlayacagiz.

#include “stdio.h”

#include “stdlib.h”

#include “windows.h”

#include “conio.h”

//turden bagimsiz stack(yigin) veri yapisi

/*************************************************************************/

typedef void * LPDATA;

typedef struct tagSTACK

{

    LPDATA pStartAdr, SP;

    size_t nSize, width;

} STACK, *PSTACK;

inline BOOL ISEMPTYSTACK(PSTACK ps) { return ps->SP == ps->pStartAdr + ps->nSize * ps->width; }

PSTACK CreateStack(size_t size, size_t width)

{

    PSTACK ret = (PSTACK) malloc(sizeof(STACK));

    if(ret == NULL)

        return NULL;

    ret->pStartAdr = malloc(size * width);

    if(ret->pStartAdr == NULL)

    {

        free(ret);

        return NULL;

    }

    ret->width  = width;

    ret->nSize  = size;

    ret->SP     = ret->pStartAdr + size * width;

    return ret;

}

BOOL Pop(PSTACK lpStack, LPDATA lpData)

{

    if(ISEMPTYSTACK(lpStack))

        return FALSE;

    memcpy(lpData, lpStack->SP, lpStack->width);

    lpStack->SP += lpStack->width;

    return TRUE;

}

BOOL Push(PSTACK lpStack, const LPDATA lpData)

{

    if(lpStack->SP == lpStack->pStartAdr)

        return FALSE;

    lpStack->SP -= lpStack->width;

    memcpy(lpStack->SP, lpData, lpStack->width);

    return TRUE;

}

void CloseStack(PSTACK lpStack)

{

    free(lpStack->pStartAdr);

    free(lpStack);

}

Iliskili kod yukaridaki gibidir.

CreateStack fonksiyonuyla bir handle¹ yaratiyoruz.Bu alan uzerinde yapidaki elemanlari; pStartAdr ayirdgimiz bellek bolgesinin baslangic adres degerini, SP ise bellek bolgesinin sinir adres degerini tutuyor.Her eleman koyma ve cekme isleminde SP hareket ederek bi gosterici gorevi goruyor ( zaten gosterici J ).

Tarih:
Hit: 5605
Yazar: guru



Yorumlar


Siftahı yapan siz olun
Yorum yapabilmek için üye girişi yapmalısınız.