3.4栈的链式实现
链栈即采用链表作为存储结构实现的栈。
为便于操作,这里采用带头结点的单链表实现栈。由于栈的插入和删除操作仅限制在表头位置进行,所以链表的表头指针就作为栈顶指针,如下图所示。
在上图中,top 为栈顶指针,始终指向当前栈顶元素前面的头结点。
若 top->next=NULL, 则代表栈空。采用链栈不必预先估计栈的最大容量,只要系统有可用空间,链栈就不会出现 溢出。采用链栈时,栈的各种基本操作的实现与单链表的操作类似,对于链栈,在使用完毕 时,应该释放其空间。
链栈的结构可用 C 语言定义如下:
typedef struct node
{
StackElementType data;
struct node
*next;
}LinkStackNode;
typedef LinkStackNode *LinkStack;
链栈的初始化及其他操作比较简单,这里不再讨论。仅给出进栈、出栈等最主要的运算实现。
1、进栈操作
int Push(LinkStack top, StackElementType x) /* 将数据元素 x 压入栈 top 中 */
{
LinkStackNode * temp;
temp=(LinkStackNode * )malloc(sizeof(LinkStackNode));
if(temp==NULL)
return(FALSE); /* 申请空间失败 */
temp->data=x;
temp->next=top->next;
top->next=temp; /* 修改当前栈顶指针 */
return(TRUE);
}
2、出栈操作
int Pop(LinkStack top, StackElementType *x)
{ /* 将栈 top 的栈顶元素弹出,放到 x 所指的存储空间中 */
LinkStackNode * temp;
temp=top->next;
if(temp==NULL) /*栈为空*/
return(FALSE);
top->next=temp->next;
*x=temp->data;
free(temp); /* 释放存储空间 */
return(TRUE);
}