数据结构学习之栈

本例主要是实现一个顺序栈;其它的啥也不说;直接上代码:函数

/*
或许这就是指针的魅力;也是指针折磨人的地方。指针能够直接对内存进行操做,很是强大;它操做的对象是地址;
是计算机最本质的东西;你在操做的时候是比较爽了;可是当你在程序中“不当心”改变了指针变量的值;当你再次
访问时;就会出现一些莫名其妙的错误(一般是访问了不应访问的内存,由于指针的内容变了;可是程序的逻辑是
没有任何错误的;你就会变得特别崩溃;本例具体的错误以下所示);指针

*/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");}

相关文章
相关标签/搜索