一、链栈的基本定义
采用链式存储结构实现的栈称为链栈,链栈通常采用单链表来实现,因此其结构与单链表的结构相同由于栈的插入和删除操作仅限制在栈顶位置进行,所以采用单链表的表头指针作为栈顶指针。
同时,为了操作方便,使用带头节点的单链表来实现链表。数据入栈或出栈时,使表头节点的指针指向新的表首节点即可,再入栈时,需要为新的数据元素动态的开辟存储单元,并修改头结点的指针域;而在出栈时,除了改变头结点的指针域,还要释放原栈顶元素所占用的空间。
二、数据类型
typedef int elemtype; //数据域数据类型
typedef struct LinkedStackNode
{
elemtype data;
LinkedStackNode *next;
}LinkedStackNode,*LinkedStack;
三、链栈的相关操作
1、链栈的初始化
链栈的初始化就是构造一个空栈,将栈顶指针top所指头结点的指针域置为NULL,因为此时栈中还没有数据元素
LinkedStack Init_LinkedStack()
{
LinkedStack top = (LinkedStackNode *)malloc(sizeof(LinkedStackNode));
//栈顶指针变量
if(top != NULL)
{
top->next = NULL;
}
return top;
}
2、判断栈是否空
若链栈top为空,则返回TRUE(或1),否则返回FALSE(或0)
int LinkedStack_Empty(LinkedStack top)
{
if(top->next == NULL)//如果栈顶的指针域指向空,则栈空
{
return 1;
}
else
{
return 0;
}
}
3、入栈
将数据元素x插入链栈的栈顶,设置头结点的指针域指向新插入的栈顶元素,若插入成功,则函数返回值为1,否则返回0
int Push_LinkedStack(LinkedStack top,elemtype x)
{
LinkedStackNode * node = (LinkedStackNode *)malloc(sizeof(LinkedStackNode));
if(node == NULL)
{
return 0;
}
else
{
node->data = x;
node->next = top->next;
top->next = node;
return 1;
}
}
4、出栈
删除栈顶数据元素,并通过x返回所删除数据的值,设置top指向链栈中的 下一个数据元素,若删除成功,函数返回1,否则返回0
int Pop_LinkedStack(LinkedStack top,elemtype *x)
{
LinkedStackNode *node;
if(top->next == NULL)
{
return 0;
}
else
{
node = top->next;
*x = node->data;
top->next = node->next;
free(node);
return 1;
}
}
5、取栈顶数据元素
读取栈顶元素,并返回其值,该运算与出栈运算的区别是栈顶元素并不删除,所以不用修改头结点的指针域
int Get_LinkedStack(LinkedStack top,elemtype *x)
{
if(top->next == NULL)
{
return 0;
}
else
{
*x = top->next->data;
return 1;
}
}