数据结构_链栈
采用链式存储的栈成为链栈,这里采用单链表实现。链栈的优点是不存在栈满上溢的情况。规定栈的所有操作都在表头进行。
链栈中数据节点的类型 LiStack定义如下:
typedef struct linknode
{
ElemType data; //数据域
struct linknode*next; //指针域
}LiStack; //定义栈类型
(1)初始化栈 InitStack(s)。
建立一个空栈s,实际上是创建链栈的头结点,并将其next域置为NULL。
void IntiStack(LiStack * &s)
{
s=(LiStack*)malloc(sizeof(LiStack));
s->next = NULL;
}
(2)销毁栈 DestoryStack(s)。
释放s占用的全部储存空间。
void DestoryStack(LiStack * &s)
{
LiStack *p=s,*q=s->next;
while(q!=NULL)
{
free(p);
p=q;
q=p->next;
}
free(p); //此时p指向为节点
}
(3)判断栈是否为空 StackEmpty(s)。
bool StackEmpty(LiStack * s)
{
return(s->next == NULL);
}
(4)进栈 Push(s,e)。
将数据节点插入到头结点之后。
void Push(LiStack * &s,ElemType e)
{
LiStack *p;
p=(LiStack*)malloc(sizeof(LiStack));
p->data = e;
p->next = s->next ;
s->next = p;
}
(5)出栈Pop(s,e)。
在栈不为空的情况下,将头节点的指针域所指数据节点的数据赋值给e,然后将该数据节点删除。
bool Pop(LiStack *s,ElemType &e)
{
LiStack *p;
if(s->next == NULL) //在栈为空的情况
return false;
p=s->next ; //p指向开始节点
e=p->data;
s->next = p->next ; //删除p节点
free(p); //释放p节点
return true;
}
(6)获取栈顶元素 GepTop(s)。
bool GetTop(LiStack * s,ElemType e)
{
if(s->next == NULL)
return false;
e=s->next -> data;
return true;
}
例题:
#include<stdio.h>
#include<Windows.h>
typedef int ElemType;
typedef struct linknode
{
ElemType data; //数据域
struct linknode*next; //指针域
}LiStack; //定义栈类型
void InitStack(LiStack * &s)
{
s=(LiStack*)malloc(sizeof(LiStack));
s->next = NULL;
}
void DestoryStack(LiStack * &s)
{
LiStack *p=s,*q=s->next;
while(q!=NULL)
{
free(p);
p=q;
q=p->next;
}
free(p); //此时p指向为节点
}
bool StackEmpty(LiStack * s)
{
return(s->next == NULL);
}
void Push(LiStack * &s,ElemType e)
{
LiStack *p;
p=(LiStack*)malloc(sizeof(LiStack));
p->data = e;
p->next = s->next ;
s->next = p;
}
bool Pop(LiStack *s,ElemType &e)
{
LiStack *p;
if(s->next == NULL) //在栈为空的情况
return false;
p=s->next ; //p指向开始节点
e=p->data;
s->next = p->next ; //删除p节点
free(p); //释放p节点
return true;
}
bool GetTop(LiStack * s,ElemType e)
{
if(s->next == NULL)
return false;
e=s->next -> data;
return true;
}
void print(LiStack * &s)
{
int e;
while(s->next != NULL)
{
Pop(s,e);
printf("%d ",e);
}
}
int main()
{
LiStack *p;
InitStack(p);
Push(p,2);
Push(p,5);
print(p);
system("pause");
return 0;
}