链表实现栈

一、链式栈的结构

二、链式栈的指针指向

链式栈的指针指向栈的顶部

三、结点和栈的结构定义

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;
}

数据结构笔记(八)-- 链式栈相关推荐

  1. 18、数据结构笔记之十八链表实现稀疏矩阵

    18.数据结构笔记之十八链表实现稀疏矩阵 "必须如蜜蜂一样,采过许多花,才能酿出蜜来." 上篇中实现了栈在多项式实现中的例子,再来看下稀疏矩阵通过链表方式实现. 关键字:十字链表存 ...

  2. 48. 数据结构笔记之四十八的有向无环图的应用关键路径

    48. 数据结构笔记之四十八的有向无环图的应用关键路径 "富贵不淫贫贱乐 , 男儿到此是豪雄.-- 程颢" 来看下有向无环图的另一个应用关键路径. 1.  关键路径 与AOV-网相 ...

  3. 一、考研数据结构笔记——引言及目录

    一.关于我理解的数据结构 1. 引言 本人自2021年3月准备考研,考研主要是为了提升学历,本科院校不是理想.迫切需要提高学历. 写这刊博客,主要是总结我考研路上对数据结构的一些理解,以及为了方便我后 ...

  4. 2022天勤考研数据结构笔记 第3章 栈和队列

    2022天勤考研数据结构笔记 第3章 栈和队列(更新中) 第3章 栈和队列 3.1 结构体定义 3.2 顺序栈 3.3 链栈 3.4 栈的应用 3.5 顺序队 3.6 链队 第3章 栈和队列 栈和队列 ...

  5. COJ 1008 WZJ的数据结构(八) 树上操作

    传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=986 WZJ的数据结构(八) 难度级别:E: 运行时间限制:3000ms: ...

  6. 归并排序算法 C++实现与时间复杂度(考过)恋上数据结构笔记

    复习梗概 画图,自己整个数组,看代码写步骤,这个对理解归并排序还是很有必要的 合并两个有序数组的merge函数写法 时间复杂度的分析方法!!! 其实我觉得去b站找个动态的步骤分解视频也是不错的复习方法 ...

  7. ReactJS学习笔记八:动画

    ReactJS学习笔记八:动画 分类: react学习笔记 javascript2015-07-06 20:27 321人阅读 评论(0) 收藏 举报 react动画 目录(?)[+] 这里只讨论Re ...

  8. 【opencv学习笔记八】创建TrackBar轨迹条

    createTrackbar这个函数我们以后会经常用到,它创建一个可以调整数值的轨迹条,并将轨迹条附加到指定的窗口上,使用起来很方便.首先大家要记住,它往往会和一个回调函数配合起来使用.先看下他的函数 ...

  9. 吴恩达《机器学习》学习笔记八——逻辑回归(多分类)代码

    吴恩达<机器学习>笔记八--逻辑回归(多分类)代码 导入模块及加载数据 sigmoid函数与假设函数 代价函数 梯度下降 一对多分类 预测验证 课程链接:https://www.bilib ...

  10. python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑

    python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑 许多人在安装Python第三方库的时候, 经常会为一个问题困扰:到底应该下载什么格式的文件? 当我们点开下载页时, 一 ...

最新文章

  1. [bat] 使用bat文件保证指定程序运行
  2. s7edge出现android停止,三星S7 Edge升级安卓7.0出现了这个问题!
  3. windows 安装pycocotools
  4. 小森生活一直服务器维护,《小森生活》怎么处理断线黑屏的问题 连接不上服务器解决办法...
  5. 【放置奇兵】魔兽资源总消耗
  6. 【收藏】hdfs参数配置详解
  7. 线性判别结合源码分析LDA原理
  8. 汤姆克兰西全境封锁服务器维护时间,汤姆克兰西全境封锁无法登录怎么解决 无法登录解决方法攻略...
  9. 秉承初心,砥砺奋进!华为云助力锦江都城开启云服务时代
  10. lisp 提取字符串中的數字_Redis 数据结构之字符串的那些骚操作
  11. 如何在HTML中关闭自动换行?
  12. 百亿级全网舆情分析系统存储设计
  13. Vue前端验证一个text只能输入手机号或邮箱
  14. struts2 国际化 中文乱码英文不乱码问题
  15. 中央电教馆虚拟实验服务器,中央电化教育馆虚拟实验教学区域培训会(广州市)召开...
  16. 自动出现的弹出窗口Js插件
  17. Windows 下编译 EXE 文件时把一个外部 txt 文件编译到 EXE 里面
  18. 02 MSC类设备-基础篇(二)
  19. github中clone代码到本地与直接下载压缩包的区别
  20. realsense中IMU的简单使用与学习

热门文章

  1. 2017 ACM-ICPC南宁网络赛: G. Finding the Radius for an Inserted Circle
  2. “盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛:I. 丢史蒂芬妮
  3. python库skimage 常值轮廓寻找并标记
  4. C语言创建顺序表并插入元素 详细注释
  5. ---单元数组-创建获取重塑单元数组----求解形如A(B)
  6. java级别_Java的访问级别(深入版)
  7. Python笔记_第五篇_Python数据分析基础教程_文件的读写
  8. 【转】ETL介绍与ETL工具比较
  9. 面向对象淡入淡出轮播图(附带面向过程)
  10. swift可选隐式可选类型