链栈带头结点

栈的链式存储结构

采用链式存储的栈称为链栈,所有操作都是在单链表的头部进行

带头结点的链栈实现

//栈的链式存储类型可描述为
//这里有两种方法
typedef struct Linknode
{
  ElemType data;         //数据域
  struct Linknode *next  //指针域
}*LiStack;               //栈类型的定义
表示用它声明的数据,就是一个指针,比如LiStack a,a就是一个指针,要访问a的数据要用a->data的方式访问。
LiStack声明的变量是指针
typedef int ElemType;
struct Node {             //单链表节点定义
	ElemType data;        //数据域
	struct Node* next;    //指针域
};
struct LinkStack {        //链栈类型定义
	struct Node* top;
};
typedef struct LinkStack* PLinkStack; //链栈类型的指针类型

带头结点的链栈定义

LinkStack CreateLinkStack(void)
{
  LNode *s;int x;//定义指针
  L=(LinkStack)malloc(sizeof(LNode));//创建头结点
  if(L==NULL) //结点申请失败,返回空指针
  {
     return NULL;
  }
  L->top=NULL;//申请成功,栈顶指针为空
  return L;   //返回空链栈
}

链栈的判空操作

bool EmptyLinkStack(PLinkStack plstack)
{
	return (L->top == NULL); //判断栈顶指针是否为空
}

链栈的判空操作
不用担心上溢这个问题

bool Push(PLinkStack plstack, ElemType e)
{
	struct Node* p = (struct Node*)malloc(sizeof(struct Node));
	if (p == NULL)             //申请新节点空间失败
	{
		return false;
	}
	//不用判断栈是否已满
	p->data = e;
	p->next = L->top;   //新节点连接到链栈栈顶指针之后,
	L->top = p;         //链栈栈顶指针指向新增节点
	return true;
}

链栈的出栈操作
入栈不需要判空,出栈需要判空
栈不空时,先用e存储栈顶元素,再让栈顶指针指向栈中的第二个结点,最后释放第一个结点的内存空间。

bool Pop(PLinkStack plstack, ElemType* e)
{
	struct Node* p;
	if (L->top == NULL)  //链栈为空,报错
	{
		return false;
	}
	*e = L->top->data;  //e记录出栈的元素
	p = L->top;         //p指向第一个节点
	L->top = p->next;   //栈顶指针指向第二个接点
	free(p);                  //释放出栈节点的内存空间
	return true;
}

为什么是p->next是指向第二个结点

取链栈的栈顶元素

bool GetTopElem(PLinkStack plstack, ElemType* e)
{
	if (L->top == NULL)  //链栈为空,报错
	{
		return false;
	}
	*e = L->top->data;   //e记录栈顶的元素
	return true;
}

参考

链接: link.

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值