栈
基本特性
后进者先出, 先进者后出, 这就是典型的栈结构
栈是一种操作受限的线性表, 只允许在一端插入和删除数据
栈是一种特定的数据结构,是对特定场景的抽象
当某个数据集合只涉及在一端插入和删除数据, 并且满足后进先出, 先进后出的特性, 我们就应该首选栈这种数据结构
实现一个栈
栈主要包含两个操作, 入栈和出栈
用数组实现的栈叫顺序栈
用链表实现的栈叫链式栈 (todo)
两种实现的空间复杂度和时间复杂度都为O(1)
栈的应用
- 函数调用栈
操作系统给每个线程分配了一块独立的内存空间,这块内存被组织成“栈”这种结构, 用来存储函数调用时的临时变量。每进入一个函数,就会将临时变量作为一个栈帧入栈,当被调用函数执行完成,返回之后,将这个函数对应的栈帧出栈 - 表达式求值
一个保存操作数的栈,一个保存运算符的栈。从左向右遍历表达式,当遇到数字,就直接压入操作数栈;当遇到运算符,就与运算符栈的栈顶元素进行比较
如果比运算符栈顶元素的优先级高,就将当前运算符压入栈;如果比运算符栈顶元素的优先级低或者相同,从运算符栈中取栈顶运算符,从操作数栈的栈顶取两个操作数,然后进行计算,再把计算完的结果压入操作数栈 - 检测括号匹配
扫描到左括号入栈, 扫描到右括号从栈顶取一个元素匹配 - 浏览器前进后退功能
两个栈实现, 首次浏览页面压入后退栈, 点击后退按钮将后退栈元素出栈压入前进栈