链栈

#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;
}			

链式栈所需要的空间是在需要的时候随时创建的,因此,在时间复杂性上,对于针对栈顶的基本操作(压入,弹出和栈顶元素存取),它的时间复杂度为O1)。需要说明的是,在堆栈的实际应用中,有时还能对非栈顶指针进行存取,对于这类的操作,链式栈需要从头开始遍历。在最好情况下,需要存取的是次栈顶元素,时间复杂度为O(1),在最坏情况下,需要存取的是栈底元素,时间复杂度是On),因此,在平均情况下,链式栈的时间复杂度是O(n)

链式堆栈是一种数据存储结构,可以通过单链表的方式来实现,使用链式栈的优点在于它能够克服用数组实现的顺序栈空间利用率不高的特点,但是需要为每个栈元素分配额外的指针空间用来存放指针域。链式栈有拥有一个指向栈顶结点的头指针,但是链式栈中没有哨位结点,而且基本操作也比链式栈要简单。对于链栈而言,使用了链表来实现栈,链表中的元素存储在不连续的地址,由于是动态申请内存,所以我们可以以非常小的内存空间开始,另外当某个项不使用时也可将内存返还给系统。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值