《数据结构与算法》3-栈

栈跟数组和链表一样也是一种线性表,只有前后节点,并且一一对应。区别就是栈的操作受限,只能从一头插入元素或者删除元素。不像数组和链表可以任意读取和删除。

读取的操作叫T pop

插入的操作叫 push(T t)

栈的底层实现可以是数组或者链表。底层是数组的栈叫顺序栈,底层是链表的栈叫链式栈

  • 顺序栈

顺序栈的最大的特点是,底层使用数组存储数据。只能使用固定大小的数组,当数组容量满时,需要申请一个更大的数组(一般是1.5倍),然后原始数组的数据copy到新的数组,然后在新的数组上插入新的数据

  • 链式栈

使用链表保存数据,不会有数据存储限制

栈的应用

栈数据结构一般用在语法分析或者是历史追踪上比较多。

  • 语法分析:

比如分析输入的占位符“{}"是否合法,例如分析:"你好,{userName}"。可以利用栈,在遍历上面的消息模版时,可以把左符号“{","[","("进行入栈操作,然后遇到右符号出栈一个元素,然后进行匹配。如果匹配则继续,如果不匹配报错。

  • 计算公示:

1+4+3/3+2*4。执行当前公式,可以创建两个栈,第一个栈保存数据,第二个栈保存运算符号。遍历计算公示,数字直接入栈,当遇到计算符号比符号栈的栈顶元素优先级高时入栈,当遇到计算符号比栈顶元素优先级低或者相等,出栈当前计算符栈的栈顶计算符,然后出栈数字栈的两个栈顶元素计算,得倒数字压入数字栈的栈顶。直到计算完结

  • 历史追踪

浏览器浏览,错误堆栈

猜你喜欢

转载自blog.csdn.net/David_lou/article/details/108597732