关于栈的结构体选择及其简单操作

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

关于栈的构造问题

-----子譞带着复习整理的心情将栈的结构主流种类叙述了一下,由于链式栈相当于单链表的变种其操作较为繁琐。而以数组为存储结构的顺序栈较为简单,因此在这里主要将以指针开空间的这类顺序栈的一些基本操作打了一遍。本人是初学者,欢迎大家给意见和建议。Qq1535976313

顺序栈:

可以用数组作为存储结构:typedef struct

{

int item[MAXITEM];

int top;

}Stack;

显然这种结构的顺序栈便于操作,但是这种结构的栈,因为其元素是存储在已开辟好的数组中的,所以这种顺序栈的大小是固定的,在没有确切知道数据大小的情况下不免会发生开辟空间浪费或者开辟空间不足的情况。

为解决这种栈空间浪费的问题,我们定义引出了双向栈那么一种结构

typedef struct

{

int item[MAXITEM];

int top1;

int top2;

}Stack;

栈底1 栈顶1 栈顶2 栈底2

当然为了避免这种情况,在构建顺序栈的结构体时,我们也大可以将结构体

中的数组替换成指针。利用指针先开辟一定大小的空间,当空间大小不够时可以用realloc(realloc函数是用来重新申请空间的,申请到更大空间后,会把原来的数据复制过去,所以不必担心会有数据丢失掉)来重新申请一定大小的空间,这样就不会出现空间的浪费和空间不足的问题了。

用指针代替数组存储的顺序栈存储结构:typedef struct

{

int *base;

int *top;

int size;

}Stack;

下面给出该类栈的一些简单操作:

#include

#include

#define MAXSIZE 50;

#define APP 10;

typedef int elemtype;

typedef struct ZHAN

{

elemtype *base;//用以开辟一块连续的空间

elemtype *top;

int size;

}sqstack;

InitStack(sqstack *s)//创建一个空栈

{

s->size=MAXSIZE;

s->base=malloc(s->size*sizeof(elemtype));

s->top=s->base;

if(!s->base)

{

printf("creat failure\n");

exit(0);

}

return 0;

}

GetTop(sqstack *s,elemtype *elem)//取栈顶元素

{

if(s->top==s->base)

{

printf("error\n");

return -1;

}

else

{

*elem=*(s->top-1);

return 0;

}

}

PushElem(sqstack *s,elemtype *elem)//压栈

{

if((s->top-s->base)>=s->size)//这段语句很巧妙的将栈溢出的问题解决了{

s->size=s->size+APP;

s->base=(elemtype*)realloc(s->base,s->size*sizeof(elemtype));

if(!s->base)

{

printf("error\n");

exit(0);

}

s->top=s->base+s->size-APP;

}

*(s->top++)=*elem;//这句语句很经典,我一开始编的时候是用下面两句语句来替换的

/* s->top++;

*(s->top-1)=*elem;*/

return 0;

}

Pop(sqstack *s)//出栈

{

if(s->base==s->top)

{

printf("error\n");

return -1;

}

else

{

s->top--;

}

return 0;

}

Empty(sqstack *s)//判断栈是否为空

{

if(s->base==s->top)//这边是使用地址是否相等来判断栈知否为空的{

printf("empty\n");

}

else

{

printf("isn't empty\n");

}

return 0;

}

Lenght(sqstack *s)//统计栈元素的个数

{

int lenght;

lenght=s->top-s->base;

return lenght;

}

Visit(sqstack *s)//非递归遍历

{

while(s->base!=s->top)

{

printf("%d\n",*(s->top-1));

s->top--;

}

return 0;

}

Visit1(elemtype *top,elemtype *bash)//递归遍历

{

相关文档
最新文档