栈是一种操作受限的线性表数据结构,它只允许在一端插入和删除数据。

特定数据结构是对特定场景的抽象,当一个数据集合只涉及在一端插入和删除数据,并且满足后进先出,先进后出的特性,就应该选择“栈”。

数组实现的栈叫做顺序栈

链表实现的栈叫做链式栈

不支持动态扩容的栈

  • 时间复杂度:O(1)

  • 空间复杂度:O(1)

支持动态扩容的顺序栈

  • 空间复杂度:O(1)

  • 最好情况时间复杂度:O(1)

  • 最坏情况时间复杂度:O(n)

  • 平均情况时间复杂度:O(1)

函数调用栈

操作系统给每个线程分配了一块独立的内存块,这种内存被组织成“栈”,用来存储函数调用时的临时变量。

每进入一个函数,就会将临时变量作为一个栈帧入栈,函数调用结束后,再将这个函数对应的栈帧出栈。

函数调用也可以使用其他数据结构,只是这种栈帧后进先出的的特性,与栈最为契合。

表达式求值

使用两个栈,一个保存操作数,一个保存运算符。

从左向右遍历表达式,如果遇到操作数,就将操作数入栈,如果遇到运算符,就与运算符栈的栈顶元素比较。

如果比运算符栈的栈顶元素优先级高,就将运算符入栈。

如果优先级低或者相等,就将栈顶元素出栈,然后从操作数栈取2个操作数,进行计算并将结果压入操作数栈,继续比较。

括号匹配

从左向右扫描字符串,如果遇到左括号,压入栈中,如果遇到右括号,则将栈顶元素出栈进行比较。

如果匹配,则继续扫描,如果栈为空或者不匹配,说明字符串非法。

扫描结束后,如果栈为空,说明字符串合法,如果栈非空,说明字符串非法。

浏览器前进、后退功能

使用两个栈X、Y,并且将首次浏览的页面压入X。

当点击后退按钮,将页面从X出栈,压入Y栈,如果X栈为空,则无法继续后退。

当点击前进按钮,将页面从Y出栈,压入X栈,如果Y栈为空,则无法继续前进。

如果点击了新页面,将Y栈清空。

Last updated

Was this helpful?