首先,栈是什么?

在代码当中,栈主要是一种实现特殊功能的一种数据结构,而不是像数组、集合之类的数据存储工具。它最大的特点就是后进先出。

那么后进先出是什么?

假设有一个数组,我们向里面添加一个数据,再添加一个。这里有两个术语,新添加的数据叫做栈顶,而第一个添加的数据叫做栈底。每次读取数据都是读取栈顶的数据,而栈底的数据在最后才能被读取。此时我们读出一个数据,那么只能读出栈顶的数据,就是2。这,就是后进先出。

  

现在我们已经了解了栈,接下来我们来看一个小问题。

通常我们使用开发工具编写代码时,如果少写了一对括号中的一个,那么开发工具就会马上告诉我们,出现了语法错误。

下面我们模拟并实现一下这个功能。

Map<String, int[]> demo = new HashMap<String, int]>();

大家看这段代码,这里少了一个中括号。如果在没有了解栈之前,我们可能会先读取出这行代码中所有的左括号,再读取出所有的右括号,最后判断他们的数量是否相同。这样做是可以的,但是有很大的限制,比如说,我们将括号的位置换一下,将中括号加在这里,那么我们刚才的逻辑就不能够有效的工作了。

  

这时,我们就可以用刚才讲的栈,来完成这个任务。

这个功能看起来需要不少的逻辑代码才能实现,但用栈来实现的话,却简单的令人不可思议。我们只需要从这段代码的左侧逐个读取字符,如果是左括号,则将它压入栈中,比如现在读取到了这里发现是左括号,就添加到数组中。

  

  如果是右括号,就将最后添加的左括号取出并判断它们是否是一对,比如读取到了这里发现是右括号,那么现在数组中保存的是<[,我们只要将最后添加的这个括号取出并和读取到的右括号进行比较。

  

  如果是一对,则将栈顶数据删除,新的栈顶是前一个添加的左括号<,程序继续运行。如果不是一对或栈为空则退出程序。但当读取完字符串之后,我们最后还要判断一下数组是否为空。因为左括号可能出现在最后,此时没有右括号和它进行配对。

  比如这样,只是将它压入到栈中,但没有右括号来和它进行比较。程序还是会正常退出。这时我们就需要判断一下,如果数组为空,则判定这段代码没有语法错误。否则这段代码有语法错误。

  

当然从右边开始读取也是可以的,只是反过来实现而已。

数据结构-->栈的更多相关文章

  1. 数据结构——栈(C语言实现)

    #include <stdio.h> #include <stdlib.h> #include<string.h> #include<malloc.h> ...

  2. C++ 泛型 编写的 数据结构 栈

    平时编程里经常需要用到数据结构,比如  栈和队列 等,  为了避免每次用到都需要重新编写的麻烦现将  C++ 编写的 数据结构   栈   记录下来,以备后用. 将 数据结构  栈   用头文件的形式 ...

  3. C语言数据结构-栈的实现-初始化、销毁、长度、取栈顶元素、查找、入栈、出栈、显示操作

    1.数据结构-栈的实现-C语言 #define MAXSIZE 100 //栈的存储结构 typedef struct { int* base; //栈底指针 int* top; //栈顶指针 int ...

  4. 数据结构——栈的实现(数组、Java)

    巩固数据结构 栈是一种有限制的线性表 只能对表尾进行操作 package com.shine.test.datastruct; import java.util.Arrays; public clas ...

  5. PHP SPL标准库之数据结构栈(SplStack)介绍(基础array已经可以解决很多问题了,现在开始解决问题)

    PHP SPL标准库之数据结构栈(SplStack)介绍(基础array已经可以解决很多问题了,现在开始解决问题) 一.总结 SplStack就是继承双链表(SplDoublyLinkedList)实 ...

  6. java数据结构——栈(Stack)

    学习数据结构与算法是枯燥的,但只有坚持不懈的积累,才会有硕果累累的明天. /** * 继续学习Java数据结构 ————栈 * 栈的实现其实还是使用数组,只不过我们不能直接访问数组下标,而是通过一个指 ...

  7. (js描述的)数据结构[栈结构](2)

    (js描述的)数据结构[栈结构](2) 一.什么是栈结构 1.一种受限制的线性结构,这种结构可以基于数组来实现. 2.可以抽象成一个容器,上面的是栈顶,底下的是栈底.所以仅允许对栈顶进行操作, 二.栈 ...

  8. 数据结构和算法(Golang实现)(14)常见数据结构-栈和队列

    栈和队列 一.栈 Stack 和队列 Queue 我们日常生活中,都需要将物品排列,或者安排事情的先后顺序.更通俗地讲,我们买东西时,人太多的情况下,我们要排队,排队也有先后顺序,有些人早了点来,排完 ...

  9. openssl stack 数据结构栈基本操作

    堆栈是两种不同的数据结构: 堆:数据先进先出: 栈:数据先进后观: 在stack.h 中 openssl 为我们提供了一个通用的栈,利用提供的接口我们可以方便的用此栈来存放开发中的任意数据. open ...

  10. JavaScript数据结构——栈和队列

    栈:后进先出(LIFO)的有序集合 队列:先进先出(FIFO)的有序集合 --------------------------------------------------------------- ...

随机推荐

  1. Ion-affix & Ion-stick 仿IOS悬浮列表插件

    Ion-affix & Ion-stick 仿IOS悬浮列表插件 Ion-affix 1.相关网页 Ion-affix 2.环境准备: 执行命令 bower install ion-affix ...

  2. Web自动化之Headless Chrome概览

    Web自动化 这里所说的Web自动化是所有跟页面相关的自动化,比如页面爬取,数据抓取,页面内容检测,页面功能测试,页面加载性能测试,页面回归测试等等,当前主要由如下几种解决方式: 文本数据获取 这就是 ...

  3. JAVAEE——SSH项目实战01:SVN介绍、安装和使用方法

    1 学习目标 1.掌握svn服务端.svn客户端.svn eclipse插件安装方法 2.掌握svn的基本使用方法 2 svn介绍 2.1 项目管理中的版本控制问题 通常软件开发由多人协作开发,如果对 ...

  4. JDBC02 利用JDBC连接数据库【使用数据库连接池】

    目录 1/2/3  Statement 和 Preparedstatement 的区别 4 读取properties配置文件 5 数据库连接池 6 利用数据库连接池连接数据库 1 使用Statemen ...

  5. c# 上传附件大小限制的问题

    在c# 相关的asp.net  中.需要设置附件的大小.需要修改2部分. 1.修改metabase.XML 以Windows2003 为例子. 打开 C:\Windows\System32\Inets ...

  6. Debian 8添加kali更新源并安装metasploit

    一.Debian 8添加kali更新源 中科大kali更新源: deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contr ...

  7. 常用的一些js和css

    /*给一组li里面写入12345.....*/ $("li").html(function(idx){ return idx+1; }) css限制文字字数: white-spac ...

  8. Android反编译odex然后重新打包

    #Android反编译odex然后重新打包 最近不知道怎么回事,突然把我那刷了氧OS的root了,然后就开始好奇起来氢OS所带有的那些本地化的东西,比如通话录音就是典型的一个之一.其中也做了很多的尝试 ...

  9. Carbondata源码系列(一)文件生成过程

    在滴滴的两年一直在加班,人也变懒了,就很少再写博客了,最近在进行Carbondata和hive集成方面的工作,于是乎需要对Carbondata进行深入的研究. 于是新开一个系列,记录自己学习Carbo ...

  10. [补] windows C socket编程——大物实验预约

    注 : 心血来潮,想着把这两年没能记录下来的经历,写一波回忆杀.诚然,有些经历十分复杂繁琐,希望能耐下性子,写出好文章来,可惜一时不能全想起来这两年来的种种,就想起来什么便写什么吧. 时间估摸着是大一 ...