数据结构-->栈
首先,栈是什么?
在代码当中,栈主要是一种实现特殊功能的一种数据结构,而不是像数组、集合之类的数据存储工具。它最大的特点就是后进先出。
那么后进先出是什么?
假设有一个数组,我们向里面添加一个数据,再添加一个。这里有两个术语,新添加的数据叫做栈顶,而第一个添加的数据叫做栈底。每次读取数据都是读取栈顶的数据,而栈底的数据在最后才能被读取。此时我们读出一个数据,那么只能读出栈顶的数据,就是2。这,就是后进先出。

现在我们已经了解了栈,接下来我们来看一个小问题。
通常我们使用开发工具编写代码时,如果少写了一对括号中的一个,那么开发工具就会马上告诉我们,出现了语法错误。
下面我们模拟并实现一下这个功能。
Map<String, int[]> demo = new HashMap<String, int]>();
大家看这段代码,这里少了一个中括号。如果在没有了解栈之前,我们可能会先读取出这行代码中所有的左括号,再读取出所有的右括号,最后判断他们的数量是否相同。这样做是可以的,但是有很大的限制,比如说,我们将括号的位置换一下,将中括号加在这里,那么我们刚才的逻辑就不能够有效的工作了。

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

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

如果是一对,则将栈顶数据删除,新的栈顶是前一个添加的左括号<,程序继续运行。如果不是一对或栈为空则退出程序。但当读取完字符串之后,我们最后还要判断一下数组是否为空。因为左括号可能出现在最后,此时没有右括号和它进行配对。
比如这样,只是将它压入到栈中,但没有右括号来和它进行比较。程序还是会正常退出。这时我们就需要判断一下,如果数组为空,则判定这段代码没有语法错误。否则这段代码有语法错误。

当然从右边开始读取也是可以的,只是反过来实现而已。
数据结构-->栈的更多相关文章
- 数据结构——栈(C语言实现)
#include <stdio.h> #include <stdlib.h> #include<string.h> #include<malloc.h> ...
- C++ 泛型 编写的 数据结构 栈
平时编程里经常需要用到数据结构,比如 栈和队列 等, 为了避免每次用到都需要重新编写的麻烦现将 C++ 编写的 数据结构 栈 记录下来,以备后用. 将 数据结构 栈 用头文件的形式 ...
- C语言数据结构-栈的实现-初始化、销毁、长度、取栈顶元素、查找、入栈、出栈、显示操作
1.数据结构-栈的实现-C语言 #define MAXSIZE 100 //栈的存储结构 typedef struct { int* base; //栈底指针 int* top; //栈顶指针 int ...
- 数据结构——栈的实现(数组、Java)
巩固数据结构 栈是一种有限制的线性表 只能对表尾进行操作 package com.shine.test.datastruct; import java.util.Arrays; public clas ...
- PHP SPL标准库之数据结构栈(SplStack)介绍(基础array已经可以解决很多问题了,现在开始解决问题)
PHP SPL标准库之数据结构栈(SplStack)介绍(基础array已经可以解决很多问题了,现在开始解决问题) 一.总结 SplStack就是继承双链表(SplDoublyLinkedList)实 ...
- java数据结构——栈(Stack)
学习数据结构与算法是枯燥的,但只有坚持不懈的积累,才会有硕果累累的明天. /** * 继续学习Java数据结构 ————栈 * 栈的实现其实还是使用数组,只不过我们不能直接访问数组下标,而是通过一个指 ...
- (js描述的)数据结构[栈结构](2)
(js描述的)数据结构[栈结构](2) 一.什么是栈结构 1.一种受限制的线性结构,这种结构可以基于数组来实现. 2.可以抽象成一个容器,上面的是栈顶,底下的是栈底.所以仅允许对栈顶进行操作, 二.栈 ...
- 数据结构和算法(Golang实现)(14)常见数据结构-栈和队列
栈和队列 一.栈 Stack 和队列 Queue 我们日常生活中,都需要将物品排列,或者安排事情的先后顺序.更通俗地讲,我们买东西时,人太多的情况下,我们要排队,排队也有先后顺序,有些人早了点来,排完 ...
- openssl stack 数据结构栈基本操作
堆栈是两种不同的数据结构: 堆:数据先进先出: 栈:数据先进后观: 在stack.h 中 openssl 为我们提供了一个通用的栈,利用提供的接口我们可以方便的用此栈来存放开发中的任意数据. open ...
- JavaScript数据结构——栈和队列
栈:后进先出(LIFO)的有序集合 队列:先进先出(FIFO)的有序集合 --------------------------------------------------------------- ...
随机推荐
- 从 JavaScript 到 TypeScript
本文首发在我的个人博客:http://muyunyun.cn/posts/66a54fc2/ 文中的案例代码已经上传到 TypeScript TypeScript 并不是一个完全新的语言, 它是 Ja ...
- JavaScript学习笔记(三)——留言板知操纵DOM节点
用JavaScript写了一个简易的留言板,暂不涉及数据库接入等. 1.功能以及流程 主要功能即为留言,用两个文本框接受用户输入的用户名以及留言内容,然后通过"提交留言"按钮将用户 ...
- Win10安裝weblogic12C
一.系统环境 Win10系统 Jdk1.8 64位 二.安装Weblogic 第一步:用系统管理员身份打开CMD命令提示符,用CMD方式进入"fmw_12.1.3.0.0_wls. ...
- 《javascript高级程序设计》笔记七
第五章 引用类型(三) 今天首先说的就是Function类型.下面就是定义函数的两种方法,第一种使用函数声明语法定义,第二种使用函数表达式定义.这两种定义函数的方式几乎没有什么区别. function ...
- isNAN()的使用
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- XManager与SecureCRT
使用Xmanager前,服务器必须已经安装好X11所需的各种运行包.运行下列命名检查安装情况,没有的话请自行补上. rpm -qa|grep x11 1.DISPLAY环境变量 export DISP ...
- vijos1080题解
题目: 对于一个递归函数w(a,b,c) 如果a<=0 or b<=0 or c<=0就返回值1. 如果a>20 or b>20 or c>20就返回w(20,20 ...
- C# Lambda表达式运用
原文作者: C# Lambda表达式 原文作者2: Lambda表达式详解 Lambda表达式 "Lambda表达式"是一个匿名函数,是一种高效的类似于函数式编程的表达式,Lamb ...
- Java系列 - 用Java8新特性进行Java开发太爽了
本人博客文章网址:https://www.peretang.com/using-java8s-new-features-to-coding-is-awesome/ 前言 从开始写博客到现在已经过去3个 ...
- 交叉编译 tesseract
官方参考资料说明: tesseract 依赖库: (https://github.com/tesseract-ocr/tesseract/wiki/Compiling#linux) leptoni ...