栈和队列的概念

栈和队列是非常重要的数据结构,后面要学习的很多算法都依赖于这俩数据结构,只要是学过编程的人应该都对这两个东东有所耳闻,这里还是对其进行复习一下,进一步认识它们的概念,虽然纯理论,但是有个了解之后有助于之后的使用。

其实栈和队列可以理解成是对之前学过的数组和链表的一种限制,下面具体来了解一下:

栈【Stack】:

先来看一下来自维基百科上对它的定义:

而为啥栈是后进先出的呢?下面看一下存数据与取数据就清楚啦:

有木有豁然开朗,也就是后放的数据先被取出来,所以是“后进先出”。

接下来看一下对实现一个栈通常需要实现的方法定义:

看一下C++对于stack的实现:

清楚了栈的定义之后,下面来看下它的实际意义:

1、函数调用过程就是一个栈的最好应用。

  比如这样一个调用过程:

  函数A ---> 函数B ---> 函数C

  而返回过程是:

  函数C ---> 函数B ---> 回至A
  刚好就是栈的特性,后进先出。

2、平常分析的算法的空间复杂度实际上就是指的栈的大小,怎么理解?

  比如说之前学习递归实现的快速排序【http://www.cnblogs.com/webor2006/p/7159078.html】的空间复杂度是O(log n),实际上也就是指函数调用的深度,而函数调用也就是一个栈的应用,所以说也是指栈的深度。

队列【Queue】:

先上维基百科的定义:

为啥它是先进先出呢?看下图:

清楚了队列的定义之后,下面来举一个实际比较有意义的使用场景:

生产者与消费者问题:有一个消费者,多个生产者,则可以利用队列将生产者生产的数据都放到队列当中,当然这个队列要是线程安全的【blockqueue】,而消费数据时则按先来后到的顺序进行一一消费。

 

总结:通过对上面的介绍,进一步发现其实栈和队列只不过是对容器【像之前学的数组或链表】进行了一定的也限制,也就是放数据得按一定的规则,而拿数据也得有一定的规则而已。

 

posted on 2017-08-07 15:31  cexo  阅读(634)  评论(0编辑  收藏  举报

导航