数据结构-->栈
首先,栈是什么?
在代码当中,栈主要是一种实现特殊功能的一种数据结构,而不是像数组、集合之类的数据存储工具。它最大的特点就是后进先出。
那么后进先出是什么?
假设有一个数组,我们向里面添加一个数据,再添加一个。这里有两个术语,新添加的数据叫做栈顶,而第一个添加的数据叫做栈底。每次读取数据都是读取栈顶的数据,而栈底的数据在最后才能被读取。此时我们读出一个数据,那么只能读出栈顶的数据,就是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)的有序集合 --------------------------------------------------------------- ...
随机推荐
- Cmake新手使用日记(1)【C++11下的初体验】
第一次使用Cmake,搜索了很多使用教程,包括<Cmake实践>.<Cmake手册>等,但是在针对最新的C++11条件下编程还是会存在一点点问题,需要实验很多次错误并搜索大量文 ...
- solr的基本概念
一.solr的基本概念 大家可以把solr搜索引擎看成一个数据库,不过是基于内存的.它可以存储信息,并且根据你的查询条件返回你想要的信息. 1.collection和core的概念 collectio ...
- flex sqlite基本用法
flex sqlite基本用法 页面 <?xml version="1.0" encoding="utf-8"?> <s:WindowedAp ...
- http(一)web和网络基础
深入学习http不为别的,只为补充底层知识,打好根基,深入了解其他技术,擒贼先擒王,学好九阳神功以后,乾坤大挪移,太极剑就容易了,急于求成,就只能变周芷若.走着...... 来源于:图解HTTP 1. ...
- Web开发资料
慢慢更新 1. Quackit 墙裂推荐!提供了一系列教程,bootstrap的模板也很好用. 2. Bootstrap 4 Cheat Sheet 好用,比官网更加一目了染.  3.Chart. ...
- Django开发的基于markdown的博客开源
PiperMarkdown Blog for Django1.11,Python 3.6,based on Markdown,网址,希望大家能给个star,谢谢! 什么是PiperMarkdown 这 ...
- PAT-1099(Build A Binary Search Tree)
题目见这里 分析:分四步进行 1)根据给定的结点情况建二叉树 2)对输入的键值排序(asending) 3)对二叉树中序遍历,同时对应赋key值 4)层次遍历(队列应用) 题目并不困难,但是我误入了 ...
- IIS 部署WCF服务注意事项
IIS部署WCF服务的时候经常会出现如下错误: System.ServiceModel.EndpointNotFoundException”类型的未经处理的异常在 WinformWcfHost.exe ...
- ASP.NET Core MVC 过滤器介绍
过滤器的作用是在 Action 方法执行前或执行后做一些加工处理.使用过滤器可以避免Action方法的重复代码,例如,您可以使用异常过滤器合并异常处理的代码. 过滤器如何工作? 过滤器在 MVC Ac ...
- memcache缓存安装配置
memcache是高性能,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度.目前用memcache解决互联网上的大用户读取是非常流行的一种用法. 下载安装 前提要先安装libev ...