一、栈的定义
所谓栈的本质也是一个线性表,只不过他具有进出,并且进出满足先进后出的原则。
一种定义方式为数组定义方式,这种方式就要求我们开辟一个特定大小的数组,就不能节省空间。
如下所示:
#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;
}
三、应用
栈的应用一般用在函数递归中,栈的使用可以节省空间。
(后续添加)