数据结构之栈(3)——链栈

前面经说过,根据存储结构的不同,将栈分为顺序栈和链栈

链栈按照链式存储结构存储

链栈原理和理解

由于栈的删除和插入操作仅限制在表头进行,所以链表的表头指针(指向头结点)就作为栈顶指针(便于方便直接使用带头结点的链表)

因此,若top(表头指针,栈顶指针)->next=NULL,则链栈为空

整个理解过程可理解为头插法

 

链栈的定义

typedef char ElemType;
typedef struct Node
{
	ElemType data;
	struct Node *next;
}LinkStackNode,*LinkStack;

  

LinkStack表示栈顶指针(指向头结点),LinkStackNode表示栈的每个节点,每个节点的data域表示数据元素,next域指向下一个节点

 

链栈的初始化:

//链栈的初始化 
void Init(LinkStack top)
{
	top->next=NULL;
}

  头结点下一个为空

 

链栈的入栈操作:不需要担心是否发生上溢

//入栈操作
bool PushStack(LinkStack top,ElemType x)
{
	LinkStackNode *temp;
	temp=(LinkStackNode*)malloc(sizeof(LinkStackNode));
	if(temp==NULL)
	return false;
	else
	{
		temp->data=x;
		temp->next=top->next;
		top->next=temp;
		free(temp);	
		return true;
	}
	
}

 由于采用了链式存储的方式,不需要担心是否上溢,注意temp要申请内存空间并且不能释放!!!!!

 

链表的出栈操作

//出栈操作
bool PopStack(LinkStack top,ElemType* e)
{
	LinkStackNode* temp;
	temp=top->next;
	if(temp==NULL)
	return false;
	else
	{
	
		*e=temp->data;
		top->next=temp->next;
		free(temp);
		return true;
	
	}
	
} 

  

注意判断是否为空,并且注意不要重复申请内存空间,并记得释放内存(temp)

 

posted @ 2016-04-05 22:42  LT.C#  阅读(1652)  评论(0编辑  收藏  举报