数据结构之栈
一、栈的定义
所谓栈的本质也是一个线性表,只不过他具有进出,并且进出满足先进后出的原则。
一种定义方式为数组定义方式,这种方式就要求我们开辟一个特定大小的数组,就不能节省空间。
如下所示:
#define MaxSize < 储存数据元素的最大个数> typedef struct{ ElementType Data[MaxSize]; int Top;//栈顶序号 }Stack
另一种方式为链表的定义方式,这种方式是以下一个元素地址作为传递的方式,这样就不用开辟一个很大的数组。
如下所示:
typedef struct Node{ ElementType Data; struct Node *Next; }LinkStack; LinkStack *Top;
注意:此处的元素为栈顶指针。
二、链式栈表的编写
我们仅以链式栈表来编写栈表程序
(1)堆栈初始化
所谓堆栈初始化就是创建一个空的栈表
需要申请一块空间内存,并且这个栈指向空
LinkStack *CreatStack(void){ LinkStack *p; p = (LinkStack *)malloc(sizeof(struct Node));//开辟一块空间 P->Next = NULL; return p; }
(2)判断栈是否为空
这个函数只需要看栈顶指向的元素是否为空即可
int IsEmpty(LinkStack *S){ return (s->next);//只需要看栈顶指向的地址是否为空,如果为空则栈为空 }
(3)入栈
就是将元素压栈进入表中。
void Push(ElementType item,LinkStack *s){ struct Node *p; p =(LinkStack *)malloc(sizeof(struct Node)); p->next = s->next; p->Data = item; s->next = p; }
(4)出栈
取出元素,取元素是从栈顶取元素。
ElementType Pop(LinkStack *S){ struct Node *p; ElementType data = NULL; //首先判断栈表是否为空 if(IsEmpty(s)){ printf("堆栈空"); } else{ p = s->next; s->next = p->next;//栈顶切换 data = p->Data;数据保存 free(p);//释放内存 } return data; }
三、应用
栈的应用一般用在函数递归中,栈的使用可以节省空间。
(后续添加)