數據結構學習之棧

本例主要是實現一個順序棧;其它的啥也不說;直接上代碼:函數

/*
或許這就是指針的魅力;也是指針折磨人的地方。指針能夠直接對內存進行操做,很是強大;它操做的對象是地址;
是計算機最本質的東西;你在操做的時候是比較爽了;可是當你在程序中「不當心」改變了指針變量的值;當你再次
訪問時;就會出現一些莫名其妙的錯誤(一般是訪問了不應訪問的內存,由於指針的內容變了;可是程序的邏輯是
沒有任何錯誤的;你就會變得特別崩潰;本例具體的錯誤以下所示);指針

*/code

#include<stdio.h>
#include<stdlib.h>對象

#define STACK_INIT_SIZE 10
#define STACK_INCREASE 2內存

typedef struct STACK
{
int *pBase;
int *pTop;
int size;
} Stack;element


void InitStack(Stack *);
void DestroyStack(Stack *);
void ClearStack(Stack *);
int Empty(Stack *);
int LengthStack(Stack *);
int GetTop(Stack *, int *);
void Push(Stack *, int);
int Pop(Stack *, int *);
void TraverseStack(Stack *);it


int main(void)
{
int i;
int e, e0;
Stack S;io

InitStack(&S);變量

for (i=0; i<10; i++)
{
Push(&S, i);
}
/*由於在程序中有了這句;因此我在進行彈出操做時怎樣也不對;打印出的e值老是垃圾數據;折騰了許久
才知道:在遍歷程序中我改變了棧底指針的值;而在彈出操做中我又使用到了棧底指針;因此纔會出現錯誤
由於是指針;在程序中某一處改變了它的值;那麼在再次訪問時就會影響;因此本程序寫的並很差*/
TraverseStack(&S);
for (i=0; i<6; i++)
{
if (Pop(&S, &e) == 1)
{
printf("pop success; the data is %d \n", e);
}
else
printf("pop failed !\n");
}
if (GetTop(&S, &e0) == 1)
{
printf("the top element is %d \n", e0);
}
else
printf(" may be stack is empty;may be code exit error.\n");遍歷

return 0;
}


/*和線性結構同樣,這樣便構造了一個線性表;也就是一個結構體,這個結構體保存了這個線性表的基本信息*/
void InitStack(Stack * S)
{
S->pBase = (int *)malloc(sizeof(int)*STACK_INIT_SIZE);
if (S->pBase == NULL)
{
printf("alloc memery is failed! \n");
exit(-1);
}
S->pTop = S->pBase;
S->size = STACK_INIT_SIZE;
}

void DestroyStack(Stack * S)
{
free(S->pBase);
S->pBase = NULL;
S->pTop = NULL;
S->size = 0;
}

void ClearStack(Stack *S)
{
S->pTop = S->pBase;
}

int Empty(Stack *S)
{
if (S->pBase == S->pTop)
return 1;
else
return 0;
}

int LengthStack(Stack * S)
{
return S->pTop - S->pBase;
}
/*該段代碼很差;由於改變了棧頂指針的值;若是再次被調用;則會出現錯誤*/
int GetTop(Stack *S, int *element)
{
int *p = S->pTop;

if (p > S->pBase)
{
*element = *(p - 1);
return 1;
}
else
return 0;
}

void Push(Stack *S, int element)
{
if (S->pTop - S->pBase == S->size)//當棧盡是一種狀況
{
S->pBase = (int *)realloc(S->pBase, (STACK_INIT_SIZE + STACK_INCREASE) * sizeof(int));
if (S->pBase == NULL)
{
printf("alloc memery is failed! \n");
exit(-1);
}
else
{
S->pTop = S->pBase + S->size;
S->size += STACK_INCREASE;
}
}
else //棧不滿的狀況
{
*(S->pTop) = element;
S->pTop ++ ;
}
}

int Pop(Stack *S, int *element)
{
if (S->pBase == S->pTop)
return 0;

-- S->pTop;
*element = *(S->pTop);

return 1;
}

/*彈出元素老是不成功,是否是由於在調用TraverseStack()函數時,將棧底指針改變了;因此纔會形成各類錯誤*/
void TraverseStack(Stack *S)
{
int *p = NULL;//由錯誤提醒咱們:在操做時,不要直接對全局變量操做;給它一個初值再進行操做;可能效好
p = S->pBase;

while (p < S->pTop) { printf("%d ", *p); p++; } printf("\n");}

相關文章
相關標籤/搜索