每篇笔记都会附上随书的Applet演示程序,有算法看不明白的,可以下载Applet 运行起来(直接打开html文件即可),可以很容易地看清楚算法的每一步。
在给一个数组或者字符串进行反向排序的时候,栈是一个不错的工具:
利用栈还可以实现回文判断、词法分析等功能。
显而易见,栈的push和pop操作的时间复杂度为O(1)。
队列 是一种先进先出(FIFO)的线性数据结构,常用操作有插入(insert)和删除(remove)。
一个简单的队列实现如下:
以上队列存在一个问题,队列满了以后,无论删除掉多少个数据项,甚至清空这个队列,仍然不能插入新的数据。其实有一种解决方法就是,在删除数据项的时候,后面的所有数据项都往前移动,但这样效率很低。
为了避免队列不满却不能插入新数据项的问题,可以让队头队尾指针绕回到数组开始的位置,这样的队列叫循环队列 。
改进后的代码如下:
队列的效率和栈一样,插入和删除数据项的时间复杂度均为O(1)。
还有一种队列叫做双端队列 ,顾名思义就是对两端都可以进行插入、删除操作的队列。如果封闭了其中一端,它就变成了一个栈;如果只允许一端插入,另一端删除,那它就成了一个普通队列。
优先级队列 和普通队列的不同之处是:它在插入数据时是有序的。所以优先级队列的插入效率会比较低,时间复杂度为O(N),删除操作则为O(1)。