如何理解“栈”?
后进者先出,先进者后出,这就是典型的“栈”结构。从栈的操作特性上来看,栈是一种操作受限的线性表,只允许在一端插入和删除数据。
当某个数据集合只涉及在一端插入和删除数据,并且满足后进先出 先进后出的特性,就应该选用这种数据结构。
我们用数组实现的栈,我们叫作顺序栈,用链表实现的栈,我们叫作链式栈。
出栈、入栈操作的均摊时间复杂度为O(1)
栈作为一个比较基础的数据结构,
应用场景:函数调用栈。
操作系统给每个线程分配了一块独立的内存空间,这块内存被组织成“栈”这种结构,用来存储函数调用时的临时变量。每进入一个函数,就会将临时变量作为一个栈帧入栈,当被调用函数执行完成,返回之后,将这个函数对应的栈帧出栈。
应用场景:表达式求值
编译器就是通过两个栈来实现的,其中一个保存操作数的栈,另一个是保存运算符的栈。我们从左向右遍历表达式,当遇到数字,我们就直接压入操作数栈;当遇到运算符,就与运算符栈的栈顶元素进行比较。
如果比运算符栈顶元素的优先级高,就将当前运算符压入栈;如果比运算符栈顶元素的优先级低或者相同,从运算符栈中取栈顶运算符,从操作数栈的栈顶取2个操作数,然后进行计算,再把计算完的结果压入操作数栈,继续比较。