数据结构与算法3-栈
什么是栈
操作栈这种数据结构可以看作是往只有向上开口的瓶子中放入大小合适的乒乓球,先放入的会被放在底部(压入栈顶),取的时候先取最上面的(弹出栈顶)。所以主要结构特性:先进后出,后进先出
栈是一种操作受限的线性表,只能在一端新增、删除。当在需要某个数据结构只能在一端操作,并且满足先进后出,后进先出特性,就优先使用栈这种数据结构
如何实现一个栈
用数组实现栈叫做顺序栈,用链表实现栈叫做链式栈。主要操作就是入栈:在栈顶插入一个元素;出栈:在栈顶删除一个元素
因为不需要额外存储空间,所以空间复杂度为O(1),入栈出栈如果只涉及栈顶个别元素的时间复杂度为O(1)
顺序栈
链式栈
均摊分析法分析-动态扩容顺序栈
应用
1、函数调用栈
操作系统为每个线程分配一块存储空间,存储空间组织成"栈"这种数据结构,主要是用来调用函数时存储临时变量。每进入一个函数,就会将临时变量作为一个栈帧入栈,当函数完成调用,就将这个函数对应的栈帧出栈。
2、表达式求值
可以通过两个栈来实现,一个栈用来保存操作数,另一个栈用来保存运算符号。从左往右遍历表达式,如果遇见数字,就压入保存操作数的栈,如果遇见运算符号,则和保存运算符号的栈顶比较,如果优先级高于栈顶元素的优先级,则压入栈中,否则从保存操作数的栈中去除两个数字,从保存运算符的栈中取出运算符,计算之后压入保存操作数的栈中,之后还将之前的运算符与保存运算符的栈顶元素比较优先级,一直到优先级高于栈顶元素,将运算符压入保存运算符的栈顶
3、括号匹配
从左往右扫面,遇到左括号就压入栈顶,遇到右括号就弹出栈顶,如果匹配成功则继续向下匹配,如果匹配失败或者栈中为空,则括号不匹配;当全部扫描完后,如果栈中为空,则匹配成功,如果栈不为空,则匹配失败
4、实现浏览器前进后退
使用两个栈(X,Y)完成。在浏览器依次点击页面,依次存入栈X中,当点击回退按钮之后就将X栈顶弹出,压入Y中,当X中为空时,表明无法再后退;当点击前进按钮时,从Y中弹出栈顶,压入X中,当Y中为空时,表面无法再前进。
当点击前进按钮时,从Y中弹出栈顶,压入X中,当Y中为空时,表面无法再前进。
如果点击了新页面,就将新页面压入X栈顶,并清空栈Y,使无法再前进到之前页面。