一、栈的定义

【百度百科】栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。

栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为后进先出表。

由于堆叠数据结构只允许在一端进行操作,因而按照后进先出(LIFO, Last In First Out)的原理运作。栈也称为后进先出表。

二、栈的示意图

三、栈的实现方式

栈可以用顺序存储,也可以用链式存储,分别称为顺序栈和链栈。

四、Java中栈的实现举例

1.利用栈实现字符串逆序

    @Testpublic void testStringReversal(){Stack stack=new java.util.Stack();String str="Hello World!";char[] chars = str.toCharArray();for (char c : chars) {stack.push(c);}while (!stack.isEmpty()) {System.out.print(stack.pop());}}

2.用栈实现括号匹配

假设表达式中只允许两种括号:()、{};
正确表达顺序为:()或{}或({})或{({}{})}的形式;如{(}或(})或({)}的表达形式均不对。
算法的设计思想:

  1)出现左括弧则进栈;

  2)出现右括弧则首先检测栈是否为空;

  •     若栈空则表明此右括弧多余,表达式不匹配。
  •     否则和栈顶数据比较,若匹配则栈顶出栈。
  •     否则表明表达式不匹配;

  3)最后若栈空,则表明匹配成功;否则表明不匹配。

/*** 此题还可以引申至配对字符符匹配问题,如单引号,双引号匹配问题。*/
public class ExpStackMatching {public boolean matching(String expression) {if (expression == null || expression == "") {System.out.println("输入表达式为空或没有输入表达式");}Stack<Character> stack = new java.util.Stack<Character>();for (int index = 0; index < expression.length(); index++) {switch (expression.charAt(index)) {case '(':stack.push(expression.charAt(index));break;case '{':stack.push(expression.charAt(index));break;case ')':if (!stack.empty() && stack.peek() == '(') {stack.pop();}break;case '}':if (!stack.empty() && stack.peek() == '{') {stack.pop();}}}if (stack.empty())return true;return false;}public static void main(String[] args) {String expression = "{((1+3)+2+4)+9*7}";ExpStackMatching oj = new ExpStackMatching();boolean flag = oj.matching(expression);if (flag) {System.out.println("匹配成功!");} else {System.out.println(" 匹配失败 ");}}
}

五、栈的字节码解析

六、我们使用过的栈

  1. Struts2的ValueStack(值栈)
  2. 使用栈实现浏览器的前进和后退

七、栈的总结

栈是一个概念上的工具,具体能实现什么功能可以由我们去想象。栈通过提供限制性的访问方法push()和pop(),使得程序不容易出错。

对于栈的实现,我们稍微分析就知道,数据入栈和出栈的时间复杂度都为O(1),也就是说栈操作所耗的时间不依赖栈中数据项的个数,因此操作时间很短。而且需要注意的是栈不需要比较和移动操作,我们不要画蛇添足。


我的微信公众号:架构真经(id:gentoo666),分享Java干货,高并发编程,热门技术教程,微服务及分布式技术,架构设计,区块链技术,人工智能,大数据,Java面试题,以及前沿热门资讯等。每日更新哦!

参考文章

  1. https://blog.csdn.net/weixin_41362649/article/details/81660908
  2. https://www.cnblogs.com/ysocean/p/7911910.html
  3. https://www.cnblogs.com/rrttp/p/7913091.html

程序员的进阶课-架构师之路(4)-栈相关推荐

  1. 程序员的进阶课-架构师之路(17)-堆

    我们来介绍另外一种数据结构-堆,注意这里的堆和我们Java语言,C++语言等编程语言在内存中的"堆"是不一样的,这里的堆是一种树,由它实现的优先级队列的插入和删除的时间复杂度都为O ...

  2. 根据id获取多维数组路径_程序员的进阶课-架构师之路(2)-数组

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37609579/article/ ...

  3. 程序员的进阶课-架构师之路(18)-图

    一.图的定义 在计算机科学中,图(Graphics)是由顶点集合(Vertex)及顶点间的关系(边)集合(Edge)组成的一种数据结构,这些顶点通过一系列边结对(连接).顶点用圆圈表示,边就是这些圆圈 ...

  4. 程序员的进阶课-架构师之路(7)-树的概念

    接下来我们将会介绍另外一种数据结构--树.二叉树是树这种数据结构的一员,后面我们还会介绍红黑树,2-3-4树等数据结构.那么为什么要使用树?它有什么优点? 前面我们介绍数组的数据结构,我们知道对于有序 ...

  5. 程序员的进阶课-架构师之路(5)-队列

    一.队列的定义 队列(queue)是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表.进行插入操 ...

  6. 程序员的进阶课-架构师之路(3)-线性表

    一.线性表的定义 [百度百科]线性表是最基本.最简单.也是最常用的一种数据结构.线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列. 线性表中数据元素之 ...

  7. 程序员的进阶课-架构师之路(2)-数组

    从这一节开始,我们就要正式进去数据结构的世界了,那么第一个是什么呢,就是我们的数组. 在我想写数组的时候,我的第一印象是去看它的源码,很可惜,数组的实现太特殊了,找了很久,我没有找到它的源码,带着这样 ...

  8. 程序员的进阶课-架构师之路(1)-数据结构与算法简介

    现在市面上的数据结构与算法的教程也都不少,但有两个问题,第一是泛泛而谈,第二是基本都是c语言实现,而java作为第一主流语言,理应有它自己的独到之处.这也是我写这些博客的初衷,我会讲解java实现的数 ...

  9. 二叉树为空意味着二叉树_程序员的进阶课-架构师之路(8)-二叉树

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37609579/article/ ...

最新文章

  1. Typora添加右键新建Markdown文件
  2. 转:AIX rcp跨主机远程拷贝数据
  3. SpringMVC-设置编码过滤器
  4. python数据分析图表展示_1行代码实现Python数据分析:图表美观清晰,自带对比功能丨开源...
  5. php的set 容器,关于STL中set容器的一些总结
  6. 小米公寓,年轻人的第一套公寓?回应来了
  7. 双目摄像头 三维坐标 python_uNetXST:将多个车载摄像头转换为鸟瞰图语义分割图像...
  8. 450g吐司烘烤温度_这不可能是吐司!不,是的
  9. 一文带你了解手机运营商类api接口
  10. springboot美容院会员管理系统毕业设计源码191740
  11. 英特尔Coffee Lake曝光:主流6核 依旧14nm
  12. 巧用计算机方法,第四课 巧用计算器教案.doc
  13. V2V-PoseNet:Voxel-to-Voxel Prediction Network for Accurate 3D Hand and Human Pose Estimation from...
  14. 2020届校招-老虎证券-Windows开发工程师笔试题
  15. VMware虚拟机下安装RedHat Linux 9.0
  16. go桌面计算机,GO桌面快速找到应用程序方法教程
  17. 点云最小二乘法拟合曲线
  18. 求1000的阶乘尾部0的个数
  19. 【百炼】二分法求函数的零点(c语言)
  20. Python学习笔记:7.5.7 Django快速建站 - Web开发实战 微信公众号开发2

热门文章

  1. php+js 表单过期
  2. Log4j2使用总结
  3. Jakarta Commons:巧用类和组件三(转)
  4. freebsd 安装教程
  5. 职场生活:辞职也有大学问
  6. 无法打开、创建WEB项目,VS2003有寄生性?
  7. 记一次kafka集群频繁crash的排查过程
  8. 浅析Kubernetes资源管理
  9. Redis面试常问2-- 从海量数据里查询某一固定前缀的key? SCAN cursor
  10. 干货 一文看尽 mysql