数据结构笔记(八)-- 链式栈
链表实现栈
一、链式栈的结构
二、链式栈的指针指向
链式栈的指针指向栈的顶部
三、结点和栈的结构定义
typedef int ElemType;//定义存储的数据类型
typedef struct SNode //定义链结点结构
{ElemType data;SNode *next;
}SNode ,*pSNode;typedef struct Stack //定义栈结构
{pSNode pTop;pSNode pBottom;
}Stack, *pStack;
三、栈操作定义
//1、初始化栈
void InitStack(pStack S);
//2、压栈
bool Push(pStack S, ElemType e);
//3、判断栈是否为空
bool StackEmpty(pStack S);
//4、出栈出栈的值用e返回
bool pop(pStack S, ElemType &e);
//5、遍历栈
void StackTraverse(pStack S);
//6、清空栈
void StackClear(pStack S);
//7、计算栈的大小
int StackLength(pStack S);
四、操作的实现
1、初始化栈
void InitStack(pStack S)
{pSNode pNewNode = (pSNode)malloc(sizeof(SNode));if (pNewNode == NULL){printf("动态内存分配失败!程序结束\n");exit(-1);}S->pTop = S->pBottom = pNewNode;// 栈顶和栈底都指向头结点
}
2、压栈
bool Push(pStack S,ElemType e)
{pSNode pNewNode = (pSNode)malloc(sizeof(SNode));//创建新结节点if (pNewNode == NULL){printf("动态内存分配失败!程序结束\n");exit(-1);}pNewNode->data = e;//新结点赋值pNewNode->next = S->pTop;//新结点指向栈顶S->pTop = pNewNode;//栈顶指针指向新结点return true;
}
3、判断栈是否为空
bool StackEmpty(pStack S)
{if (S->pTop == S->pBottom)return true;elsereturn false;
}
4、出栈出栈的值用e返回
bool pop(pStack S, ElemType &e)
{pSNode p = S->pTop;//定义临时指针p指向栈顶if (StackEmpty(S)){return false;}e = S->pTop->data;//获取栈顶指向结点值S->pTop = S->pTop->next;//栈顶指针指向下一个结点free(p);//释放空间p = NULL;//临时指针p指向空return true;
}
5、遍历栈
void StackTraverse(pStack S)
{pSNode p = S->pTop;//定义临时指针p指向栈顶while (p!=S->pBottom){printf(" %d",p->data);p = p->next;}printf("\n");
}
6、清空栈
void StackClear(pStack S)
{pSNode p = S->pTop;//定义临时指针p指向栈顶while (S->pTop != S->pBottom){S->pTop = S->pTop->next;free(p);p = S->pTop;}free(p);p = NULL;
}
7、计算栈的大小
int StackLength(pStack S)
{pSNode p = S->pTop;int i = 0;while (p!=S->pBottom){i++;p = p->next;}return i;
}
最后给出完整代码
// 链式栈.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
#include <stdio.h>
#include<stdlib.h>
#include<malloc.h>typedef int ElemType;//定义存储的数据类型
typedef struct SNode //定义链结点结构
{ElemType data;SNode *next;
}SNode ,*pSNode;typedef struct Stack //定义栈结构
{pSNode pTop;pSNode pBottom;
}Stack, *pStack;//1、初始化栈
void InitStack(pStack S);
//2、压栈
bool Push(pStack S, ElemType e);
//3、判断栈是否为空
bool StackEmpty(pStack S);
//4、出栈出栈的值用e返回
bool pop(pStack S, ElemType &e);
//5、遍历栈
void StackTraverse(pStack S);
//6、清空栈
void StackClear(pStack S);
//7、计算栈的大小
int StackLength(pStack S);int main()
{Stack S;InitStack(&S);for (int i = 0; i < 10; i++){Push(&S, 2 * i);}StackTraverse(&S);if (StackEmpty(&S)){printf("栈为空\n");}else{printf("栈不为空\n");}printf("栈的大小为%d\n",StackLength(&S));ElemType e;for (int i = 0; i < 3; i++){pop(&S, e);printf("第 %d 个出栈元素值为 %d\n",i,e);printf("栈的大小为%d\n", StackLength(&S));}StackClear(&S);printf("栈的大小为%d\n", StackLength(&S));return 0;
}//1、初始化栈
void InitStack(pStack S)
{pSNode pNewNode = (pSNode)malloc(sizeof(SNode));if (pNewNode == NULL){printf("动态内存分配失败!程序结束\n");exit(-1);}S->pTop = S->pBottom = pNewNode;// 栈顶和栈底都指向头结点
}
//2、压栈
bool Push(pStack S,ElemType e)
{pSNode pNewNode = (pSNode)malloc(sizeof(SNode));//创建新结节点if (pNewNode == NULL){printf("动态内存分配失败!程序结束\n");exit(-1);}pNewNode->data = e;//新结点赋值pNewNode->next = S->pTop;//新结点指向栈顶S->pTop = pNewNode;//栈顶指针指向新结点return true;
}
//3、判断栈是否为空
bool StackEmpty(pStack S)
{if (S->pTop == S->pBottom)return true;elsereturn false;
}
//4、出栈出栈的值用e返回
bool pop(pStack S, ElemType &e)
{pSNode p = S->pTop;//定义临时指针p指向栈顶if (StackEmpty(S)){return false;}e = S->pTop->data;//获取栈顶指向结点值S->pTop = S->pTop->next;//栈顶指针指向下一个结点free(p);//释放空间p = NULL;//临时指针p指向空return true;
}
//5、遍历栈
void StackTraverse(pStack S)
{pSNode p = S->pTop;//定义临时指针p指向栈顶while (p!=S->pBottom){printf(" %d",p->data);p = p->next;}printf("\n");
}
//6、清空栈
void StackClear(pStack S)
{pSNode p = S->pTop;//定义临时指针p指向栈顶while (S->pTop != S->pBottom){S->pTop = S->pTop->next;free(p);p = S->pTop;}free(p);p = NULL;
}
//7、计算栈的大小
int StackLength(pStack S)
{pSNode p = S->pTop;int i = 0;while (p!=S->pBottom){i++;p = p->next;}return i;
}
数据结构笔记(八)-- 链式栈相关推荐
- 18、数据结构笔记之十八链表实现稀疏矩阵
18.数据结构笔记之十八链表实现稀疏矩阵 "必须如蜜蜂一样,采过许多花,才能酿出蜜来." 上篇中实现了栈在多项式实现中的例子,再来看下稀疏矩阵通过链表方式实现. 关键字:十字链表存 ...
- 48. 数据结构笔记之四十八的有向无环图的应用关键路径
48. 数据结构笔记之四十八的有向无环图的应用关键路径 "富贵不淫贫贱乐 , 男儿到此是豪雄.-- 程颢" 来看下有向无环图的另一个应用关键路径. 1. 关键路径 与AOV-网相 ...
- 一、考研数据结构笔记——引言及目录
一.关于我理解的数据结构 1. 引言 本人自2021年3月准备考研,考研主要是为了提升学历,本科院校不是理想.迫切需要提高学历. 写这刊博客,主要是总结我考研路上对数据结构的一些理解,以及为了方便我后 ...
- 2022天勤考研数据结构笔记 第3章 栈和队列
2022天勤考研数据结构笔记 第3章 栈和队列(更新中) 第3章 栈和队列 3.1 结构体定义 3.2 顺序栈 3.3 链栈 3.4 栈的应用 3.5 顺序队 3.6 链队 第3章 栈和队列 栈和队列 ...
- COJ 1008 WZJ的数据结构(八) 树上操作
传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=986 WZJ的数据结构(八) 难度级别:E: 运行时间限制:3000ms: ...
- 归并排序算法 C++实现与时间复杂度(考过)恋上数据结构笔记
复习梗概 画图,自己整个数组,看代码写步骤,这个对理解归并排序还是很有必要的 合并两个有序数组的merge函数写法 时间复杂度的分析方法!!! 其实我觉得去b站找个动态的步骤分解视频也是不错的复习方法 ...
- ReactJS学习笔记八:动画
ReactJS学习笔记八:动画 分类: react学习笔记 javascript2015-07-06 20:27 321人阅读 评论(0) 收藏 举报 react动画 目录(?)[+] 这里只讨论Re ...
- 【opencv学习笔记八】创建TrackBar轨迹条
createTrackbar这个函数我们以后会经常用到,它创建一个可以调整数值的轨迹条,并将轨迹条附加到指定的窗口上,使用起来很方便.首先大家要记住,它往往会和一个回调函数配合起来使用.先看下他的函数 ...
- 吴恩达《机器学习》学习笔记八——逻辑回归(多分类)代码
吴恩达<机器学习>笔记八--逻辑回归(多分类)代码 导入模块及加载数据 sigmoid函数与假设函数 代价函数 梯度下降 一对多分类 预测验证 课程链接:https://www.bilib ...
- python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑
python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑 许多人在安装Python第三方库的时候, 经常会为一个问题困扰:到底应该下载什么格式的文件? 当我们点开下载页时, 一 ...
最新文章
- [bat] 使用bat文件保证指定程序运行
- s7edge出现android停止,三星S7 Edge升级安卓7.0出现了这个问题!
- windows 安装pycocotools
- 小森生活一直服务器维护,《小森生活》怎么处理断线黑屏的问题 连接不上服务器解决办法...
- 【放置奇兵】魔兽资源总消耗
- 【收藏】hdfs参数配置详解
- 线性判别结合源码分析LDA原理
- 汤姆克兰西全境封锁服务器维护时间,汤姆克兰西全境封锁无法登录怎么解决 无法登录解决方法攻略...
- 秉承初心,砥砺奋进!华为云助力锦江都城开启云服务时代
- lisp 提取字符串中的數字_Redis 数据结构之字符串的那些骚操作
- 如何在HTML中关闭自动换行?
- 百亿级全网舆情分析系统存储设计
- Vue前端验证一个text只能输入手机号或邮箱
- struts2 国际化 中文乱码英文不乱码问题
- 中央电教馆虚拟实验服务器,中央电化教育馆虚拟实验教学区域培训会(广州市)召开...
- 自动出现的弹出窗口Js插件
- Windows 下编译 EXE 文件时把一个外部 txt 文件编译到 EXE 里面
- 02 MSC类设备-基础篇(二)
- github中clone代码到本地与直接下载压缩包的区别
- realsense中IMU的简单使用与学习
热门文章
- 2017 ACM-ICPC南宁网络赛: G. Finding the Radius for an Inserted Circle
- “盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛:I. 丢史蒂芬妮
- python库skimage 常值轮廓寻找并标记
- C语言创建顺序表并插入元素 详细注释
- ---单元数组-创建获取重塑单元数组----求解形如A(B)
- java级别_Java的访问级别(深入版)
- Python笔记_第五篇_Python数据分析基础教程_文件的读写
- 【转】ETL介绍与ETL工具比较
- 面向对象淡入淡出轮播图(附带面向过程)
- swift可选隐式可选类型