栈:先进后出,后进先出,典型的栈结构。
属于操作受限的线性表,只支持一段进行插入和删除数据。具体操作有两种入栈与出栈,可以用数据与链表构成。
实现一个栈
栈实现的方式有两种,通过一个数组或者链表构成一个栈,需要自己在周六日的时候实现。
- 数组实现的栈叫做顺序栈,链表实现的栈叫做链式栈
- 顺序栈进行扩容的思路也是跟数组扩容一样。链式栈不同扩容的操作。
- 时间复杂度:不涉及到扩容,那么时间复杂度是O(1),涉及到扩容时间复杂度是O(N)。复制的时候只考虑入栈操作拷贝,那么均摊时间复杂度是O(1),均摊时间复杂度一般都等于最好情况时间复杂度。
栈在函数中的应用
每个线程分配一块独立的内存空间,这个空间称为栈。
用栈这种结构来存储函数调用时的临时变量,并且临时变量当做一个栈帧入栈。调用完毕后再出栈。
表达式求值的应用
求解 34+13*9=44-12/3
利用两个栈来实现。第一个栈用来存储我们的数字变量,第二个栈用来存储运算符。
运算符栈要跟在栈顶的运算符进行比较。如果比栈顶的优先级高,就将当前的运算符压入栈中。
当比栈顶的运算符等级低或者相等的时候,就把前面的数字进行计算。该运算符等待计算完毕后再操作。
栈在括号中的使用。
检查括号是否匹配。
一组括号组合,进行入栈操作,每次入栈前与栈顶的元素进行匹配,检查是否能匹配上。
匹配上,移除栈顶元素;匹配不上,将该元素进行入栈操作。
最后把括号扫描完成后,栈为空,代表都是合法字符。不为空,代表非法字符有没有匹配上的。
浏览器的前进与后退
用两个栈来实现。
一个栈用来做页面前面的保存,一个栈做退出的保存页面链接。
比如从a ->b ->c 那么栈就存储了a,b,c 元素 。倒退那么就把c放到第二个栈中。c,b,a。这样就保存了下来这些链接内容,知道怎么前进与退出了