![4dd9582ac96d79e30454f2510ecb7762.png](https://i-blog.csdnimg.cn/blog_migrate/de32ea1c175c0713b6e5ce38d29cfcb6.jpeg)
数据结构与算法,相信上过这门课的仁都知道,他是多磨可爱,确实你多磨练自己,才会感觉他可爱。我之前天真的以为只要课程结课了,我就不用再受到他的折磨,现在看来,还是太年轻啊,T_T,我现在发现,他总是会不经意地出现在意想不到的地方,让我不知所措。
![cd1e2f848d5ed1dbff8f2df252bcc9b9.png](https://i-blog.csdnimg.cn/blog_migrate/970105afb2a68b9b032233f10d3e357a.png)
01
背包(bag)
简介
背包(Bag)是一种不支持从中删除元素的一种数据结构——这种数据结构的主要用处就是收集元素,并且提供遍历所有集合中的元素的方法。他的迭代顺序是随机的,并不确定。
API
public class Bag<Item> implements Iterable<Item> { Bag(); //创建一个背包 void add(Item item); //添加元素 boolean isEmpty(); //是否为空背包 int size(); //背包中的元素个数}
理解
其实背包这种数据结构和 `java`中的 `Set`集合类似,储存一系列同种的元素,遍历访问时随机,顺序不确定。
其实我们可以将背包这种数据结构形象的理解为一个袋子(Bag),而且不透明。现在,我们将弹珠理解成对应的元素,袋子(Bag)中 放入一定数量的弹珠。因为袋子不透明,我们在取元素的时候,从实际情况来看,可以随机地取得一个弹珠元素,不过在背包中,没有建立有效的索引等其他结构,理论上是无法取得一个元素的,只能通过遍历的方式进行寻找或者得到所有的元素。
![cd2c7d2478e326ddb0f23826eabcb1a3.png](https://i-blog.csdnimg.cn/blog_migrate/c99a63642c7db14a1353820eb5e1f908.png)
应用
之前已经说了,`背包`这种数据结构是可以用来收集元素的。于是我们可以从这个角度应用到一个从文本文件中读取整形数据到一个整型数组中,并且不需要预先知道数据的数量,不过这种方式,得到的数据不具有文件中的原始顺序,这就要求我们对该数据集的顺序不关心。这是应用背包进行数据读取的一个先决条件。我们的实现思想是先从标准输入流中读取元素,并将元素放入到一个支持该类型的 `背包` ,当所有的数据读取完毕后,便根据 `背包` 中的元素个数来创建对应数组,最后将 `背包` 的元素遍历出来并存入到数组中。
伪代码
pubic int[] getData(String file){ Bag bag = new Bag(); readData(file,bag); int datas[] = new int[bag.size()]; int i = 0; for(Integer data : bag) { datas[i++] = data; } return datas;}
02
队列(Queue)——先进先出(FIFO)
简介
队列,是一种按照先进先出的原则而设计的数据结构,他最大的特点就是,他的输出元素顺序和添加元素的顺序是一样的,也可以实现上述背包读取数据的功能,并且能够保证数据的顺序不被破坏。
API
public class Queue<Item> implements Iterable<Item> { Queue(); //创建一个队列 void add(Item item); //添加元素 boolean isEmpty(); //是否为空队列 int size(); //队列中的元素个数 Item getItem(); //获得队首元素}
理解
在 `Java` 中也有队列对应集合,原理都类似。
同样我们可以将其和现实生活中的事物联系起来理解。我们可以将 `队列` 理解为一个高速路口收费站,车辆行驶到收费站等待收费后出高速,车辆先到的先结费,放行,后来的车辆必须等待到前面的车辆结费并安全驶出收费区,才能够进入收费区结费。这其实就是很形象的队列实现模型。
![c85bf3a96db034691daffcf1018ba7ae.png](https://i-blog.csdnimg.cn/blog_migrate/7186d732a932c1123fe48d16193feb4c.png)
应用
之前已经说了,`队列` 这种数据结构是可以实现上述 `背包` 数据读取的功能,并且具有了 `背包` 不具备的保留数据顺序的特点,这将更好地为我们提供有意义的数据集。实现的思路也基本类似。
伪代码
pubic int[] getData(String file){ Queuequeue = new Queue(); readData(file,queue); int datas[] = new int[queue.size()]; for ( int i = 0 ; i < datas.length ; i ++ ) { datas[i] = queue.getItem(); } return datas;}
03
下压栈(Stack)——后进先出(LIFO)
简介
`栈`,是一个基于后进先出原则而设计的一种数据结构,他的应用范围很广泛,平常我也会经常使用这种数据结构来解决一些问题,比如后面会举例的算术表达式求值。栈的实现方式也有很多种,有顺序表栈和链表栈等,(`顺序表`以及`链表`后续文章会涉及到),对应的类型还用定容栈和可变容量栈。
API
public class Stack<Item> implements Iterable<Item> { Stack(); //创建一个栈 void push(Item item); //添加元素 boolean isEmpty(); //是否为空栈 int size(); //栈中的元素个数 Item pop(); //获得栈首元素}
理解
日常的消息系统基本都和栈的原理差不多,比如邮件系统
邮件系统就是一个比较形象的栈的模型,每当有新的邮件到的时候,该封邮件在你邮箱的收件箱中必定是处于置顶的状态,待下一封邮件到来的时候,之前的邮件就会被往下压,腾出顶部位置给最新邮件,下压栈也就是这个意思。同样,在读取邮件的时候,你最先得到的是最新的邮件,也比较符合人们办公的逻辑,也就是出栈的原理。
![ff0e24731af67bf7af9c19dc14e9772c.png](https://i-blog.csdnimg.cn/blog_migrate/8a71f75405ec2b688a2a3d2dc8815d36.png)
应用
这里由于篇幅和时间的限制,具体的应用,会在后续文章推出,主要是依据之前提到的算术表达式求值来探索关于栈这种数据结构的应用方面的问题。
![ab213670a66d1075ffdeb89a50826c63.png](https://i-blog.csdnimg.cn/blog_migrate/b148679dbb9345ba7a2b64dcaca94112.jpeg)
然Coder
微信号 : huazai990728
CSDN:LengDanRan
![d4b86d98b63997c8a6028620bbb8807c.gif](https://i-blog.csdnimg.cn/blog_migrate/195fac3dcee070314849771bd23496ae.gif)
球分享
![d4b86d98b63997c8a6028620bbb8807c.gif](https://i-blog.csdnimg.cn/blog_migrate/195fac3dcee070314849771bd23496ae.gif)
球点赞
![d4b86d98b63997c8a6028620bbb8807c.gif](https://i-blog.csdnimg.cn/blog_migrate/195fac3dcee070314849771bd23496ae.gif)
球在看