一、链栈
链栈是一种数据存储结构,可以通过单链表的方式来实现,使用链栈的优点在于它能够克服用数组实现的顺序栈空间利用率不高的特点,但是需要为每个栈元素分配额外的指针空间用来存放指针域。
二、数据类型
typedef int ELEM_TYPE;
typedef struct Node
{
ELEM_TYPE data;
struct Node* next;
}Node;
typedef struct Lstack
{
struct Node phead;
}Stack;
三、链栈的相关操作
1、初始化
void Init(Stack* pst)
{
if(pst == NULL)
{
return;
}
pst->phead.next = NULL;
}
2、申请新的结点
Node* BuyNode(ELEM_TYPE val)
{
Node* pnewnode = (Node*)malloc(sizeof(Node));
if(pnewnode == NULL) exit(0);
pnewnode->data = val;
pnewnode->next = NULL;
}
3、进栈
bool Push(Stack* pst,ELEM_TYPE val)
{
if(pst == NULL)
{
return false;
}
Node* pnewnode = BuyNode(val);
pnewnode->next = pst->phead.next;
pst->phead.next = pnewnode;
return true;
}
4、出栈
bool IsEmpty(Stack* pst)
{
return pst->phead.next == NULL;
}
bool Pop(Stack* pst)
{
if(IsEmpty(pst))
{
return false;
}
Node* pCur = pst->phead.next;
pst->phead.next = pCur->next;
free(pCur);
return true;
}
bool Pop1(Stack* pst,ELEM_TYPE* prt)
{
if(IsEmpty(pst))
{
return false;
}
Node* pCur = pst->phead.next;
pst->phead.next = pCur->next;
*prt = pCur->data;
free(pCur);
return true;
}
5、获取栈顶元素
ELEM_TYPE TOP(Stack* pst)
{
if (IsEmpty(pst))
{
return 0;
}
return pst->phead.next->data ;
}
6、清空栈
void clear(Stack* pst)
{
Node* pCur = pst->phead.next;
Node* pNext = pCur;
while(pCur != NULL)
{
pNext = pCur->next;
free(pCur);
pCur = pNext;
}
pst->phead.next = NULL;
}
void Destory(Stack* pst)
{
clear(pst);
}
栈的常见应用:浏览器历史记录、Android的最近任务、Activity的实现模式、CPU中栈的实现、Word自动保存、解析计算式、解析xml/json