哈喽!这里是一只派大鑫,不是派大星。本着基础不牢,地动山摇的学习态度,从基础的C语言语法讲到算法再到更高级的语法及框架的学习。更好地让同样热爱编程(或是应付期末考试 狗头.jpg)的大家能够在学习阶段找到好的方法、路线,让天下没有难学的程序(只有秃头的程序员 2333),学会程序和算法,走遍天下都不怕!

今天我们来一起深入学习一下非常重要以及基础的数据结构——栈(stack)

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。


1、栈(Stack)是一种线性存储结构,它具有如下特点:

(1)栈中的数据元素遵守“先进后出"(First In Last Out)的原则,简称FILO结构。(后进先出的叫法,也是可以的)

(2)限定只能在栈顶进行插入和删除操作。

2、栈的相关概念:

(1)栈顶与栈底:允许元素插入与删除的一端称为栈顶,另一端称为栈底。

(2)压栈:栈的插入操作,叫做进栈,也称压栈、入栈。

(3)弹栈:栈的删除操作,也叫做出栈。

3、栈的常用操作为:

(1)弹栈,通常命名为pop

(2)压栈,通常命名为push

(3)求栈的大小

(4)判断栈是否为空

(5)获取栈顶元素的值

4、栈的常见分类:

(1)基于数组的栈——以数组为底层数据结构时,通常以数组头为栈底,数组头到数组尾为栈顶的生长方向

(2)基于单链表的栈——以链表为底层的数据结构时,以链表头为栈顶,便于节点的插入与删除,压栈产生的新节点将一直出现在链表的头部

5、实例分析

使用标准库的栈时, 应包含相关头文件,在栈中应包含头文件: #include< stack > 。定义:stack< int > s;

常用操作:

s.empty();         //如果栈为空则返回true, 否则返回false;
s.size();          //返回栈中元素的个数
s.top();           //返回栈顶元素, 但不删除该元素
s.pop();           //弹出栈顶元素, 但不返回其值
s.push();          //将元素压入栈顶

需要注意的是,用STL虽然方便,但是如果不打开 -O2优化,就有一点慢。

在非常需要追求运行速度的情况下,往往需要自己手写栈。


栈实现的演示

例如我们有一个存储整型元素的栈,我们依次压栈:{1,2,3}

在压栈的过程中,栈顶的位置一直在”向上“移动,而栈底是固定不变的。
如果我们要把栈中的元素弹出来:

出栈的顺序为3、2、1 ,顺序与入栈时相反,这就是所谓的”先入后出“。
在弹栈的过程中,栈顶位置一直在”向下“移动,而栈底一直保持不变。

如果你玩过一种称为汉诺塔的益智玩具,你就会知道游戏中小圆盘的存取就是一种先进后出的顺序,一个圆柱就是一个栈:

来看一看动图就很清楚了~~~

栈实现的方式

1.基于数组的栈实现

当以数组为底层数据结构时,通常以数组头为栈底,数组头到数组尾为栈顶的生长方向:

2.基于单链表的栈

以链表为底层的数据结构时,以链表头为作为栈顶较为合适,这样方便节点的插入与删除。压栈产生的新节点将一直出现在链表的头部;

关于栈的具体实现以及一些会用到栈的题目,后续慢慢更新(ps:因为备战考研太忙了)

1.栈的具体实现代码(会写新文章)

2.和栈相关的算法题(会依次解答)

C/C++ stack栈的理解以及使用相关推荐

  1. java内存stack heap_java内存解析-------stack(栈)和heap(堆)的理解

    学习编程的时候,经常会看到stack这个词,它的中文名字叫做"栈". 理解这个概念,对于理解程序的运行至关重要.容易混淆的是,这个词其实有三种含义,适用于不同的场合,必须加以区分. ...

  2. java 线程栈大小配置,JVM运行时数据区详解-Stack栈(优化配置、代码样例)

    最近有段时间没有更新Netty的教程了,却发了一些其他的东西.可能有的朋友会问,难道这就完事了?不会的.两方面原因.第一.笔者也是需要工作的人,自然要完成好工作中的任务,这里面也有很多东西需要学习和研 ...

  3. 如何给女朋友讲明白:Java中Stack(栈)与Heap(堆)

    背景 Java中Stack(栈)与Heap(堆)是面试中被经常问到的一个话题. 有没有对Java中Stack(栈)与Heap(堆)烂熟于心的童鞋,请举手!!!(怎么没人举手-) 这个时候蜗牛哥的对象弱 ...

  4. [Java]Stack栈和Heap堆的区别(终结篇)[转]

    首先分清楚Stack,Heap的中文翻译:Stack-栈,Heap-堆. 在中文里,Stack可以翻译为"堆栈",所以我直接查找了计算机术语里面堆和栈开头的词语: 堆存储: hea ...

  5. 【C++ 语言】容器 ( queue 队列 | stack 栈 | priority_queue 优先级队列 | set 集合 | 容器遍历 | map )

    文章目录 queue 队列 stack 栈 priority_queue 优先级队列 priority_queue 优先级队列指定排序方法 priority_queue 优先级队列排序行为 prior ...

  6. java集合类——Stack栈类与Queue队列

    今日走读代码时,遇到stack栈类,特查看java的API文档,总结如下: Stack继承Vector类,它通过五个操作对类 Vector 进行了扩展. 栈是 后进先出的. 栈提供了通常的 push ...

  7. 关于栈的理解(读书笔记)

    关于栈的理解(读书笔记) 标签: 栈内存布局可执行程序 2013-03-16 02:16 2957人阅读 评论(1) 收藏 举报 分类: [C语言学习](56) 版权声明:本文为博主原创文章,未经博主 ...

  8. Stack(栈 c++模版实现)

    Stack(栈 c++模版实现) // // Created by XXX on 2021/7/10. //#ifndef C11LEARN_STACK_H #define C11LEARN_STAC ...

  9. JAVA Stack栈和Heap堆的区别(转)

          首先分清楚Stack,Heap的中文翻译:Stack-栈,Heap-堆. 在中文里,Stack可以翻译为"堆栈",所以我直接查找了计算机术语里面堆和栈开头的词语:  堆 ...

最新文章

  1. 【手记】解决启动SQL Server Management Studio 17时报Cannot find one or more components...的问题
  2. 2013递归求解单链表中的结点个数(C++,附递归函数思路讲解与手绘图)
  3. 工作资讯003---甘特图
  4. 查看linux服务器dns,Linux中查看和设置DNS服务器
  5. SQL Server差异备份的备份/还原原理
  6. 傅里叶变换的终极解释上
  7. python字符串的删除操作_学习快人一步|python中常见的27个字符串操作
  8. Python —— 第一部分 序列
  9. archLinux安装记录
  10. Combo Box 组合框
  11. linux常用命令导图
  12. 为一加七Pro(LineageOs17.1 4.14内核版本)编译KernelSu
  13. VS2013编译libjpeg库
  14. mysql 767 bytes_max key length is 767 bytes
  15. 域名商GoDaddy发行价20美元:估值45亿美元
  16. Microsoft 桌面程序运行库V5.0
  17. 套接字(socket)通俗解
  18. WPL、最优二叉树(哈夫曼树)
  19. 木头的 blog 。
  20. 如何下载河北区卫星地图高清版大图?

热门文章

  1. 微软强行安装Firefox扩展程序
  2. android surfaceflinger 代码,Android 中的framebuffer和SurFaceFlinger的关系
  3. Spring 简化配置(了解/不推荐)
  4. unity创建项目报错:解决sentinel key not found (h0007) Unity
  5. 各种编程语言,Linux命令行播放,Bio-Linux,Markdown编辑器等
  6. python 搜寻蓝牙_3 Python Web搜寻器和搜寻器
  7. ubuntu迁移到_为什么Ubuntu开发人员门户迁移到DjangoCMS
  8. 安装Bootstrap3编译版本
  9. Bootstrap 流式栅格系统
  10. c语言用字符串统计一个整数中数字的个数_全国计算机等级考试二级C语言