栈、队列、散列表、哈希算法
文章目录
栈
如何理解“栈”
后进者先出,先进者后出,这就是典型的“栈”结构。
从栈的操作特性上来看,栈是一种“操作受限”的线性表,只允许在一端插入和删除数据。
当某个数据集合只涉及在一端插入和删除数据,并且满足后进先出、先进后出的特性,我们就应该首选“栈”这种数据结构。
如何实现一个“栈”?
用数组实现的栈,我们叫作顺序栈,用链表实现的栈,我们叫做链式栈。
|
|
不管是顺序栈还是链式栈,空间复杂度是O(n),时间复杂度是O(1)。
支持动态扩容的顺序栈
摊还分析法,时间复杂度O(1)
栈在函数调用中的应用
函数调用栈
栈在表达式求值中的应用
表达式求值
编译器通过两个栈来实现,一个保存操作数的栈,另一个是保存运算符的栈。我们从左向右遍历表达式,当遇到数字,直接压入操作数栈;当遇到运算符,就与运算符栈的栈顶元素进行比较。
如果比运算符栈顶元素的优先级高,就将当前运算符压入栈;如果比运算符栈顶元素的优先级低或者相同,从运算符栈中取栈顶运算符,从操作数栈的栈顶取2个操作数,然后进行计算,再把计算完的结果压入操作数栈,继续比较。
栈在括号匹配中的应用
浏览器前进和后退功能
都是利用两个栈实现
内容小结
栈是一种操作受限的数据结构,只支持入栈和出栈操作。后进先出是它最大的特点。栈既可以通过数组实现,也可以通过链表来 实现。不管基于数组还是链表,入栈、出栈的时间复杂度都为O(1)。除此之外,我们还讲了一种支持动态扩容的顺序栈,你需要重点掌握它的均摊时间复杂度分析方法。
队列
文章作者 静晓晨曦
上次更新 2020-03-20