#include <stdio.h>
#include "LinkStack.h"
LinkStack *Creat_Stack ()//创建栈
{
LinkStack *s = (LinkStack *)malloc(sizeof(LinkStack)/sizeof(char));
s->top=NULL;
return s;
}
int StackEmpty (LinkStack *S)//判断栈空否
{
if(s==NULL)
{
errno = ERROR;
return FALSE;
}
return s->top == NULL;
}
int Push (LinkStack *S, StrackData x)//进栈
{
if(s==NULL)
{
errno = ERROR;
return FALSE;
}
Node* node = (Node*)malloc(sizeof(Node)/sizeof(char));
if(node == NULL)
{
erron = MALLOC_ERROR;
return FALSE;
}
node->data = x;
node->next = s->top;
s->top = node;
return TRUE;
}
int Pop (LinkStack *s, StrackData *x)//出栈
{
if(s==NULL)
{
errno = ERROR;
return FALSE;
}
Node* p = s->top;
*x = p->data;
s->top = p->next;
free(p);
return TRUE;
}
int GetTop (LinkStack *s, StrackData *x)//取栈顶
{
if (s == NULL)
{
errno = ERROR;
return FALSE;
}
if(StackEmpty(S))
{
erron = MALLOC_ERROR;
return FALSE;
}
*x = s->top;
return TRUE;
}
int Destroy(LinkStack *s)//销毁栈
{
if (s == NULL)
{
errno = ERROR;
return FALSE;
}
int x;
while(StackEmpty(s) != TRUE)
{
Pop (s, &x);
}
free(s);
return TRUE;
}
链式栈所需要的空间是在需要的时候随时创建的,因此,在时间复杂性上,对于针对栈顶的基本操作(压入,弹出和栈顶元素存取),它的时间复杂度为O(1)。需要说明的是,在堆栈的实际应用中,有时还能对非栈顶指针进行存取,对于这类的操作,链式栈需要从头开始遍历。在最好情况下,需要存取的是次栈顶元素,时间复杂度为O(1),在最坏情况下,需要存取的是栈底元素,时间复杂度是O(n),因此,在平均情况下,链式栈的时间复杂度是O(n)。
链式堆栈是一种数据存储结构,可以通过单链表的方式来实现,使用链式栈的优点在于它能够克服用数组实现的顺序栈空间利用率不高的特点,但是需要为每个栈元素分配额外的指针空间用来存放指针域。链式栈有拥有一个指向栈顶结点的头指针,但是链式栈中没有哨位结点,而且基本操作也比链式栈要简单。对于链栈而言,使用了链表来实现栈,链表中的元素存储在不连续的地址,由于是动态申请内存,所以我们可以以非常小的内存空间开始,另外当某个项不使用时也可将内存返还给系统。