网站首页 > 技术文章 正文
栈的链式存储结构
栈的链式存储结构是指用一组任意的存储单元来存储栈中的数据元素,用这种链式存储结构存储的栈称为链栈(Link Stack)。链栈的结点结构与单链表的结点结构相同,由于栈的插入和删除操作仅限制在栈顶进行,所以可用不带头结点的单链表实现栈的链式存储结构以使链栈的操作运算更加方便。在链栈中,每一个结点表示栈中的一个元素,链表的头指针称为栈顶指针,如果设栈顶指针top是node类型的变量,则top指向栈顶结点(第一个结点)。
栈的链式存储结构定义如下:
struct node /*链栈的结点类型*/ { ElemType data; /*链栈结点的数据域*/ struct node *next; /*链栈结点的指针域*/ };
struct node *top; /*top定义为指向结点类型的指针变量*/
一个链栈由栈顶指针top唯一确定。当top为空(NULL)时,表示该链栈为空栈;若链栈非空,则top指向栈顶结点。栈中元素的数据类型用ElemType表示,可根据需要指定其具体的类型。假设元素以a1, a2,a3,…,an的顺序进栈,则a1为栈底元素,an为栈顶元素,如图3-3所示。
链栈的基本操作
于链栈的结点是动态分配的,因此链栈只有空栈和非空栈这两种状态,不会出现栈满的情况。
假设在链栈中,top为node类型的全局变量。
(1)初始化栈
链栈初始化栈算法
void InitStack() { top=NULL; /*将栈顶指针置空表示空栈*/ }
(2)判栈空
链栈判栈空算法
int StackEmpty() { if( top==NULL) return 1; /* 如果栈为空,则返回1 */ else return 0; /* 否则返回0 */ }
(3)进栈
进栈操作是在栈顶位置插入一个值为x的新元素。
算法要点:
(1)为待进栈元素x动态分配一个新结点p,并把x赋给新结点p的数据域;
(2)将新结点p的指针域指向原栈顶结点;
(3)使top指向新结点p,即使值为x的新结点p成为新的栈顶结点;
(4)函数返回新的栈顶指针。
链栈进栈算法
void Push(ElemType x) { struct node *p; p=(struct node*)malloc(sizeof(struct node)); /*生成新结点*/ p->data=x; /*给新结点p的数据域赋x值*/ p->next=top; /*新结点p的指针域指向原栈顶结点*/ top=p; /*修改栈顶指针,使之指向新结点*/ }
(4)出栈
出栈运算是从栈中删除一个元素。当栈不空时,可通过修改栈顶指针达到元素删除的目的。
算法要点:
(1)检查栈是否为空,若为空,进行“下溢”错误处理;
(2)取栈顶元素保存在x中;
(3)栈顶指针指向前一个结点;
(4)函数返回新的栈顶指针。
链栈出栈算法
ElemType Pop() { struct node *p; /* 定义指针变量p */ int x; /* 定义一个变量x,用以存放出栈的元素 */ if(top==NULL) { /* 检查链栈是否为空 */ printf("栈下溢错误!\n"); exit(1); /* 若栈空不能出栈,则退出运行 */ } p=top; /* 用指针变量p暂存栈顶指针 */ x=p ->data; /* 栈顶元素送x */ top=top->next; /* 栈顶指针指向下一个结点 */ free(p); /* 回收原栈顶结点 */ return x; /* 返回原栈顶元素 */ }
(5)取栈顶元素
链栈取栈顶元素算法
ElemType GetTop() { if((top)==NULL) { /* 检查链栈是否为空 */ printf("栈下溢错误!\n"); exit(1); /* 若栈空不能出栈,则退出运行 */ } return (top)->data; /* 若栈非空,则返回栈顶元素 */ }
猜你喜欢
- 2024-10-04 nodejs配置和环境的搭建(nodejs 配置)
- 2024-10-04 广州蓝景分享—Webpack 基础教学,正在自学前端的你赶快收藏起来
- 2024-10-04 五分钟了解 Node.js Shebang(五分钟了解中国历史)
- 2024-10-04 怎么解决koa写server发布的噩梦(koa server)
- 2024-10-04 Node直出方案的实现及性能测试(node技术)
- 2024-10-04 webpack5入门到实战(5-处理 js 资源)
- 2024-10-04 Node-red Function&注入功能介绍
- 2024-10-04 Linux实战017:Ubuntu搭建NodeJS开发环境
- 2024-10-04 手把手告诉你如何安装多个版本的node
- 2024-10-04 Node编程基本语法(nodejs基础语法)
- 10-02基于深度学习的铸件缺陷检测_如何控制和检测铸件缺陷?有缺陷铸件如何处置?
- 10-02Linux Mint 22.1 Cinnamon Edition 搭建深度学习环境
- 10-02AWD-LSTM语言模型是如何实现的_lstm语言模型
- 10-02NVIDIA Jetson Nano 2GB 系列文章(53):TAO模型训练工具简介
- 10-02使用ONNX和Torchscript加快推理速度的测试
- 10-02tensorflow GPU环境安装踩坑日记_tensorflow配置gpu环境
- 10-02Keye-VL-1.5-8B 快手 Keye-VL— 腾讯云两卡 32GB GPU保姆级部署指南
- 10-02Gateway_gateways
- 最近发表
-
- 基于深度学习的铸件缺陷检测_如何控制和检测铸件缺陷?有缺陷铸件如何处置?
- Linux Mint 22.1 Cinnamon Edition 搭建深度学习环境
- AWD-LSTM语言模型是如何实现的_lstm语言模型
- NVIDIA Jetson Nano 2GB 系列文章(53):TAO模型训练工具简介
- 使用ONNX和Torchscript加快推理速度的测试
- tensorflow GPU环境安装踩坑日记_tensorflow配置gpu环境
- Keye-VL-1.5-8B 快手 Keye-VL— 腾讯云两卡 32GB GPU保姆级部署指南
- Gateway_gateways
- Coze开源本地部署教程_开源canopen
- 扣子开源本地部署教程 丨Coze智能体小白喂饭级指南
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- js判断是否是json字符串 (75)
- c语言min函数头文件 (77)
- asynccallback (87)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 无效的列索引 (74)