栈的链式存储结构简称为链栈
链式栈是通过单链表来实现的。每次入栈一个元素,向链表中添加一个节点(相当于头插法),出栈一个元素,释放一个节点。
头插法可参照链表的方式.
- 定义链栈结构:
#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;
}