链栈结点的类型定义如下:
typedef struct node
{
DataType data;
struct node *next;
}LStackNode,*LinkStack;
链栈的说明如下:
(1)链栈通过链表实现,链表的第一个结点为栈顶,最后一个为栈底。
(2)设栈顶指针为top,初始化时,不带头结点top=NULL,带头结点top->next=NULL。
链栈的基本运算:
(1)链栈的初始化操作。
链栈的初始化就是把栈初始化为空,需要为头结点分配存储单元,并且将头结点的指针域置为空即可。
void InitStack(LinkStack *top)
{
if ((*top=(LinkStack)malloc(sizeof(LStackNode)))==NULL)
{
exit(-1);
}
(*top)->next=NULL;
}
(2)判断链栈是否为空。
int StackEmpty(LinkStack top)
{
if (top->next==NULL)
{
return 1;
}
else
{
return 0;
}
}
(3)进栈操作。
进栈操作就是将元素插入到链栈的栈顶,将新结点插入到链表的第一个结点之前。
int PushStack(LinkStack top,DataType e)
{
LStackNode *p;
if ((p=(LStackNode*)malloc(sizeof(LStackNode)))==NULL)
{
printf("内存分配失败");
exit(-1);
}
p->data=e;
p->next=top->next;
top->next=p;
return 1;
}
(4)出栈操作。
出栈操作就是将单链表中的第一个结点删除,并释放结点空间。
int PopStack(LinkStack top,DataType *e)
{
LStackNode *p;
p=top->next;
if (!p)
{
printf("栈已空");
return 0;
}
top->next=p->next;
*e=p->data;
free(p);
return 1;
}
(5)取栈顶元素操作。
int GetTop(LinkStack top,DataType *e)
{
LStackNode *p;
p=top->next;
if (!p)
{
printf("栈已空");
return 0;
}
*e=p->data;
return 1;
}
(6)求表长查找。
int StackLength(LinkStack top)
{
LStackNode *p;
int count=0;
p=top;
while(p->next!=NULL)
{
p=p->next;
count++;
}
return count;
}
(7)销毁链栈操作。
void DestroyStack(LinkStack top)
{
LStackNode *p,*q;
p=top;
while(!p)
{
q=p;
p=p->next;
free(q);
}
}