栈的另一种实现方法,链表。(不存在栈满上溢的情况)
1.栈的链式存储结构:
typedef struct linknode
{
ElemType data;
struct linknode * next;
}LiStack;
2.链栈四要素:
①栈空条件
s->next = NULL;
②进栈操作
头插法–将包含e的节点插入到头节点之后
尾插法也可实现,但是另需要一个指针指向尾节点。
③出栈操作
取出头节点之后节点的元素并删除之
3.链栈的操作函数
①初始化链栈
void InitLiStack(LiStack * &s)
{
s = (LiStack *)malloc(sizeof(LiStack));
s->next = NULL;
}
②销毁链栈
void DestroyStack(LiStack * &s)
{
LiStack * p = s;
LiStack * q = s->next;
while(q!=NULL)
{
free(p);
p = q;
q = p->next;
}
free(p);
}
需要额外定义一个指针指向要释放节点的下一个节点。
③判断空栈
bool StackEmpty(LiStack * &s)
{
return (s->next == NULL);
}
④进栈操作Push
void Push(LiStack * &s,ElemType e)
{
LiStack * p;
p = (LiStack *)malloc(sizeof(LiStack));
p->data = e;
p->next = s->next;
s->next = p;
}
⑤出栈操作Pop
bool Pop(LiStack * &s,ElemType &e)
{
LiStack * p;
if(s->next == NULL)
return false;
p = s->next;
e = p->data;
s->next = p->next;
free(p);
return true;
}
⑥取栈顶元素
bool GetTop(LiStack * &s,ElemType &e)
{
if(s->next == NULL)
return false;
e = s->next->data;
return true;
}