一、栈的介绍

栈又名堆栈,它是一种运算受限的线性表。

栈的特点:限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从栈中删除元素又称作出栈、弹栈,它是把栈顶元素删除掉,使其下面的元素成为新的栈顶元素。

和之前讲到的链表一样也是一种数据呈线性排列的数据结构,不过在这种结构中,我们只能访问最新添加的数据。

武器弹匣相信大家都不陌生,子弹由下至上装入,最后装入的子弹 最先打出。栈的特点亦是如此:元素 先进后出 or 后进先出。

二、栈的基本操作

接下来我们说一下栈的运作方式,上面提到了 元素先进后出 ,如下图所示:

栈中有5个元素,若 先执行入栈再执行出栈,那么出栈的将会是 元素六;相反如果 限制性出栈再执行入栈,那么出栈元素就是元素五。

栈与线性表相似,分为顺序存储与链式存储,我们分别展示到下文。

总结:栈元素的出入 都是在栈顶执行。


栈的初始化

栈的顺序存储

这里我们用数组来存储,栈的结构体表示为:

typedef struct Stack{int data[MXA];        //数据域   (MAX 为 宏定义值)int size;             //栈的大小 (指 栈中的元素个数)}Stack;

顺序栈-初始化

申请空间这里我们使用 malloc函数 ,size长度 的初值指向栈底。每当插入一个元素时长度加1,弹出一个元素时长度减1,因此,非空栈中的栈顶指针始终在栈顶元素的下一个位置上。

SeqStack create(){//创建栈,相当于 动态开辟一个数组出来SeqStack p = (Stack *)malloc(sizeof(Stack));if(!p){printf("空间开辟失败!");return;}//初始化 栈 的大小p->size = 0;//初始化 栈中的元素for(int i=0; i<MAX ;i++){p->data[i] = 0;        //将元素初始化为0}//返回指针return p;}

顺序栈-入栈

入栈时,我们需要注意 栈是否不存在 与 是否已经栈满。

void push(SeqStack stack){if(!stack){return;}//这里我们判断 是否栈满if( stack->size == MAX ){        //当栈的大小达到 为栈所定义的最大值时 表示栈满printf("栈已满!\n");return;    //栈满则结束程序 不执行入栈操作}int value;printf("请输入待入栈值:");scanf("%d",&value);// stack->size 栈的大小,就是 待插入元素 的下一个位置stack->data[stack->size] = value;//因为元素入栈 所以栈顶指针向上移动stack->size++;}

顺序栈-出栈

出栈时,我们需要注意 栈是否不存在 与 是否已经栈空。

void pop(SeqStack stack){if(!stack)return;//我们判断栈是否为空,当它的长度指向栈底时 表明 栈中无元素,即栈空if(stack->size == 0){printf("栈已空\n");return;}//删除一个元素//我们上述说到,栈顶指针永远指向非空栈中的元素下一个位置,所以这里我们可以利用栈顶指针减一来获取栈顶元素的位置stack->data[stack->size -1] = 0;//元素出栈 栈顶指针向下移动stack->size --;}

顺序栈-遍历

void forerachStack(SeqStack stack){if(!stack) {return;}//这里我们定义一个循环,使循环变量小于栈顶指针for(int i=0; i< stack->size ; i++) {printf("%d ",stack->data[i]);}}

栈的链式存储

这里我们使用链表存储,结构体表示为:

//结点结构体
trpedef struct Node{int data;                    //结点数据域struct Node *next;           //结点指针域
}Node;//栈的结构体
trpedef struct Stack{struct Node header;          //头结点int size;                    //栈的大小 即元素个数}Stack, *LinkStack;

链栈-初始化

注意事项:

struct Node *list;            list->next  list->next
struct Node a;                a.data  a.next

当前者为指针变量时,我们使用:->
当前者为其它变量时,我们使用:.

LinkStack inir_LinkStack(){//创建 myStack 指针,指向所申请的空间LinkStack myStack = (Stack *)malloc(sizeof(Stack));if(!Stack) {return NULL;}//初始化 长度为0myStack->size = 0;//相当于 初始化 链表的头结点 指针域myStack->header.next = NULL;}

链栈-入栈

入栈时,我们同样需要注意 栈是否不存在 与 是否已经栈满。

void push(LinkStack stack){if(!stack)return;//创建一个结点Node *p = (Node *)malloc(sizeof(Node));int value;printf("请输入待入栈值:");scanf("%d",&value);//给 结点数据域 赋值,也可以在 11行的scanf函数中 直接输入 &p->datap->data = value;//这里使用头插法//先使新结点的指针域存放首元结点的地址p->next= stack->header.next;//再使头结点指向新结点stack->header.next = p;//同上,因为元素入栈 所以栈顶指针向上移动stack->size ++;}

链栈-出栈

出栈时,我们同样要注意 栈是否不存在 与 是否已经栈空。

void pop(LinkStack stack){//判断栈是否存在if(!stack)return;//判断栈空if(stack->size ==0){printf("栈中无元素!\n");return;}//定义一个节点类型的指针,用作删除结点Node *p = stack->header.next;//头结点 连接到 删除结点 的后边stack->header.next = p->next;//释放结点free(p);//同上,元素出栈 栈顶指针向下移动stack->size --;}

总结

以上就是栈的一些基本操作啦,如果你觉得本文章有用的话请留下个点赞再走吧!拜拜~~

C语言-堆栈 什么是栈?一篇文章带你了解…相关推荐

  1. 一篇文章带你熟悉 TCP/IP 协议(网络协议篇二)

    涤生_Woo 2017年11月11日阅读 15544 关注 一篇文章带你熟悉 TCP/IP 协议(网络协议篇二) 同样的,本文篇幅也比较长,先来一张思维导图,带大家过一遍. 一图看完本文 一. 计算机 ...

  2. 一篇文章带你快速理解JVM运行时数据区 、程序计数器详解 (手画详图)值得收藏!!!

    受多种情况的影响,又开始看JVM 方面的知识. 1.Java 实在过于内卷,没法不往深了学. 2.面试题问的多,被迫学习. 3.纯粹的好奇. 很喜欢一句话:"八小时内谋生活,八小时外谋发展. ...

  3. 一篇文章带你领悟 Frida 的精髓(基于安卓8.1)

    转载(一篇文章带你领悟Frida的精髓(基于安卓8.1)):https://www.freebuf.com/articles/system/190565.html <Frida操作手册>: ...

  4. 一篇文章带你搞懂微信小程序的开发过程

    点击上方"前端进阶学习交流",进行关注 回复"前端"即可获赠前端相关学习资料 今 日 鸡 汤 只解沙场为国死,何须马革裹尸还. 大家好,我进阶学习者. 前言 小 ...

  5. 一篇文章带你详解 HTTP 协议

    一篇文章带你详解 HTTP 协议 本篇文章篇幅比较长,先来个思维导图预览一下. 一张图带你看完本篇文章 一.概述 1.计算机网络体系结构分层 计算机网络体系结构分层 2.TCP/IP 通信传输流 利用 ...

  6. 一篇文章带你了解大数据生态圈---大数据组件图谱

    小编一篇文章带你了解大数据生态圈-大数据组件图谱 转载地址:http://blog.csdn.net/u010039929/article/details/70157376 文章目录 小编一篇文章带你 ...

  7. java ee 值范围_一篇文章带你读懂: Java EE

    原标题:一篇文章带你读懂: Java EE 点击上图,查看教学大纲 何为 Java EE Java EE是一个标准中间件体系结构 不要被名称"Java PlatformEnterprise ...

  8. 学习笔记-一篇文章带你领悟frida的精髓

    一篇文章带你领悟frida的精髓(基于安卓8.1) frida是啥? frida为什么这么火? frida实操环境 基本能力Ⅰ:hook参数.修改结果 基本能力Ⅱ:参数构造.方法重载.隐藏函数的处理 ...

  9. css 科技 边框_一篇文章带你学习CSS3图片边框

    这篇文章我们来讲一下在网站建设中,一篇文章带你学习CSS3图片边框.本文对大家进行网站开发设计工作或者学习都有一定帮助,下面让我们进入正文. 使用CSS3 border-image 属性,你可以在元素 ...

  10. 借重新装系统之际,一篇文章带你玩透Windows 10从系统安装到软件选择

    系统安装所需软件 Rufus 一个制作USB-ISO的免费软件,比微软官方工具好的地方在于除了可以制作windows 系统U盘,还可以制作linux 以及安卓X86的系统安装光盘. 借重新装系统之际, ...

最新文章

  1. rails3 ajax替换成js
  2. Jena文档《An Introduction to RDF and the Jena RDF API》的译文
  3. 羊车门问题python_python编程羊车门问题代码示例
  4. linux搭建hdfs
  5. Unity3D 之UGUI 滑动条(Slider)
  6. 禁用应用中Android系统的导航栏(特别是平板)
  7. Odoo10参考系列--Odoo指导方针
  8. maven netty 配置_网络编程(二)Netty编程之一
  9. 【证明】【一题多解】【等价转换】—— 排列组合的计算
  10. 小程序新能力微信扫码直接跳转小程序
  11. linux压缩文件夹
  12. 修改版本名称及手机型号
  13. DAMA-DMBOK 数据治理功能框架
  14. API接口电商平台商品详情,网络爬虫数据(步骤示例,参数返回值说明)
  15. 拼音表大全图_一年级语文26个汉语拼音字母表读法+写法+笔顺(附视频)
  16. KEIL MDK平台 S3C2440 C语言软件仿真
  17. 医院预算目标分解公式
  18. SEM谈谈如何摆脱Involute?
  19. javascript制作PPT
  20. 货币金融学-期末复习

热门文章

  1. 智慧大田——智能无线灌溉系统
  2. 从long long 谈类型转换
  3. 天源财富:“中国天眼”发现201颗新脉冲星
  4. 技术将加强首席执行官和首席财务官之间的关系
  5. vue 传base64到后台后台传到oss的java实现
  6. 公司里开发用的机器,虚拟机、网络、转发、ssh连接、远程桌面、远程开机……等一系列骚操作的操作概述
  7. 《跟我一起写 Makefile》--陈皓
  8. POE电源模块详解及设计参考-MQ7801/MQ7802
  9. orbslam2学习记录
  10. Sharding-JDBC + SpringBoot