关于栈的学习笔记——链栈

栈的链式存储结构简称为链栈

链式栈是通过单链表来实现的。每次入栈一个元素,向链表中添加一个节点(相当于头插法),出栈一个元素,释放一个节点。
头插法可参照链表的方式.

  •  定义链栈结构:
#include<iostream>
using namespace std;

#define MaxSize 128
typedef int ElemType;

//数据节点对象
typedef struct node {
	ElemType data;        //数据域
	struct node *next;    //指针域
}stackNode,LinStack_s;    //stackNode 栈的节点  LinStack_s链栈中可理解为链表头节点


//链栈
typedef struct _LinkStack {
	LinStack_s *top; //栈顶指针;
	int size;        //元素个数
}LinkStack; 
  • 初始化链栈:
bool InitStack(LinkStack &s) {
	s.top=(LinStack_s*)malloc(sizeof(stackNode));//分配栈顶指针空间 
                                                 //sizeof(stackNode)表示数据 节点多大我就多大
	if (!s.top)return false;            //  如果分配失败则初始化失败
	s.top = NULL;                          //栈顶指针初始化;
	s.size = 0;                           //栈大小置空               
	return true;
}
  • 判断栈空,满的条件:
bool isEmpty(LinkStack&s) {
	if (s.size == 0)return true;
	return false;
}

bool isFull(LinkStack &s) {
	if (s.size == MaxSize) {
		return true;
	}
	return false;
}
  • 入栈操作:
//入栈
bool PushStack(LinkStack&s,ElemType e){
	LinStack_s *d= (LinStack_s*)malloc(sizeof(stackNode));
                                              //可理解为一个链表的头结点分配节点空间
	if (!d)return false;
	d->data = e;                              //节点的数据域
	d->next = s.top;                          //头插法,此时插入栈顶的前面
	s.top = d;                                //栈顶更新  此时栈顶就为该节点
	s.size++;                                 //元素个数更新
	return true;
}
  • 出栈操作 
//出栈
bool PopStack(LinkStack&s,ElemType&e) {
	stackNode *i=null;
	if (isEmpty(s))return false;    //判断是否为空, 为空无元素出栈
	e = s.top->data;                //用e来存储出栈的值
	i = s.top;                      //保存当前栈顶指针的地址 为释放做准备
	s.top = s.top->next;            //栈顶更新
	free(i);                        //释放未更新前的栈顶
	s.size--;                       //个数更新
	return true;
}
  • 获取栈顶元素:
//获取栈顶元素
ElemType GetTop(LinkStack&s) {    
	if (isEmpty(s))return -1;    //栈为空 返回-1;

	return s.top->data;    
}
  • 返回元素值
//返回栈内元素个数,长度
int GetLength(LinkStack&s) {
	return s.size;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_____Marr?cat

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值