熟练使用内存(2)

1.栈,队列

栈和队列,都可以不通过指定地址和索引来对数组的元素进行读写。需要临时保存计算过程中的数据,链接在计算机上的设备或者输入输出数据时,都可以通过这些方法来使用内存。如果每次保存临时数据都需要指定地址和索引,程序就会变得比较麻烦,因此要加以改进。

2.栈和队列的区别

  1. 栈和队列的区别在于数据出入的顺序是不同的
  2. 栈用的是LIFOLast Input First Out ,后进先出)方式
  3. 队列用的是FIFO(First Input First Out,先进先出)方式

1.循环处理是指反复进行多次同样的处理
2.我这里所说的栈不是函数调用时使用的栈,而是值程序员自身做成的LIFO形式得数据存储方式(该栈的实体是数组)
3.通常情况下,往栈写入数据称为“入栈”,从栈中读出数据称为“出栈”,同理队列也是如此被称为“入列”和“出列”。

3.栈和队列的数据的写入和读取函数

  1. 这里我们暂且把往栈中写入数据的函数命名为Push,把从栈中读出数据的函数命名为Pop,把往队列中写入数据的函数命名为 EnQueue,把从队列中读出数据的函数命名为DeQueue

  2. PushPop以及EnQueueDeQueue分别组成一对函数,PushEnQueue用于为函数的参数传递要写入的数据。PopDeQueue用于将读出的数据作为函数返回值返回。

  3. 通过使用这些函数,可以将数据临时保存(写入),然后再在需要的时候·把这些数据读出来。

  4. 在栈中,LIFO方式表示栈的数组中所保存的最后面的数据(Last In)会被先读取出来(First Out),队列就是保存的数据(First In),会被先读取出来(First Out)。下面用两个通俗易懂的列子来表示一下他们数据的存入和读取顺序。

  1. 栈的存取方式就像是我们倒水喝水,我们把往里倒入的动作作为存入数据(First In),如果你要喝水,你喝的第一口水是最后进入杯子的水你最先倒入的水是你最后才能喝的到的,所以我们叫做(Last Out)。

  2. 队列的存取方式我把他比作是排队买票,你去的越晚买票越晚,把排队的时间作为存入数据(First In),你是第一个排队的那你肯定是第一个取票的,所以你最先进去,最先出来我们就叫做(First Out)。

  3. 别抬杠,我举得例子都说正常情况下的,如果某些人非要跟我抬杠说我喝水喜欢从下面喝怎么办,我排队就是喜欢插队怎么办,那你比较厉害了,我觉的你可以发明更高级的东西,大佬发财了记得带上小弟,啊哈哈。

  4. 如果真有这样的需求,后面的文章我会陆续介绍泛型集合和字典,你们喜欢插队就去这里面插队就好了,栈和队列真的不允许插队的,亲。

  1. 链表使元素的追加和删除更容易

    1. 接下来介绍的链表和二叉查找树,都是不用考虑索引的顺序就可以对数组进行读写的方式。通过使用链表,可以更加高效的对数组数据(元素)进行追加和删除处理。而通过使用二叉查找树,则可以更加高效的对数组数据进行检索。
    2. 在数组的各个元素中,除了数据的值之外,通过为其附件上下一个元素的索引,即可实现链表。数据的值和下一个元素的索引合在一起,就构成了数组的一个元素,这样,数组元素相连就构成了念珠似的链表。由于链表的末尾没有后续的数据,因此就需要用别的值来填充。
    3. 下面来插入一个链表的示例(初始状态):
      熟练使用内存(2)
    4. 在需要追加或者删除数据的情况下,使用链表使很高效的。首先,让我们来看一下删除的情况。在上图表示的链表中,假设要删除从起始位置开始的第三个元素,此时,我们只需要把第二个元素的下一个元素“2”变成下一个元素“3”即可。
    5. 由于数组的元素通常是按照索引顺序来引用的,因此当我们需要引用链表的数组的某一个元素时,通过该元素的索引信息就可以找到下一个元素。当第2个元素的下一个元素变成第4个元素后,那么第3个元素就被删除了,虽然在第3个元素在物理内存上还残存着,但是在逻辑上确实是被删除了。
    6. 接下来我们看一下如何往链表中追加数据。假设要在上图的第5位前追加一个新数据。此时,我们只需要在刚才消除的第3个元素的位置中保存新的数据,并将第4个元素的下一个元素:“5”变更成下一个元素“2”,以使新追加的元素的索引信息变成下一元素“5”,即可。虽然新追加的元素在物理上是第3个,但是从逻辑上看来是第5个。
  2. 二叉查找树使数据搜索更加有效

    1. 二叉查找树是指在链表的基础上往数组中追加元素时,考虑数据的大小关系,将其分成左右两个方向的表现形式。假如,假设我们事先先把50这个数值保存到了数组中。那么,如果接下来的值比先前保存的数值大的话,就要将其放到右边,反之如果小的话就放在左边。但是实际的内存并不会分成两个方向,这是在程序逻辑上实现的
    2. 下面放一张二叉查找树的模型(将树颠倒后的形状)以便于理解。
      熟练使用内存(2)
    3. 使用二叉查找树的便利之处在于可以使数据的搜索等更有效率。在使用一般的数组时,必须从数组的开头按照索引顺序来查找目标数据。而使用二叉查找树时,当目标数据比现在读出来的数据 小时就可以转到左侧,反之当目标数据较大时即可转到链表的右侧,这样就加快了找到目标数据的速度。

关于栈,队列,链表和二叉查找树的简单介绍就到这里,本文主要作为本人个人学习所用,大家如果觉得对你有一点点的帮助麻烦点个小关注,以后博主会更新更多的文章供自己和大家学习所用,谢谢!