栈的定义
栈是一种操作受限的线性表,只允许在一端进行插入和删除操作。
栈的特点
先进后出
为什么需要栈
虽然数组和链表更加灵活,并且都可以满足只在一端进行插入和删除操作的需求,但是由于会暴露其他操作,存在引发错误操作的风险,所以,当某个数据集合只涉及在一端进行插入和删除数据,并且满足先进后出的操作特性时,应首先使用栈这种数据结构。
如何实现一个栈
栈既可以用数组来实现,也可以用链表来实现
用数组实现的栈,叫顺序栈;用链表实现的栈,叫链式栈
基本操作的性能
入栈时间复杂度O(1), 空间复杂度O(1)
出栈时间复杂度O(1), 空间复杂度O(1)
栈的应用场景
- 函数调用
为什么函数调用要用栈来保存临时变量?
函数调用符合后进先出的特性,用栈来实现最为合适。从调用函数进入被调用函数,变化的是作用域,从根本上讲,只要保证每进入一个新函数,都是一个新的作用域就可以,而实现这个,用栈最合适。进入被调用函数,分配一段栈空间给这个函数的变量,在这个函数结束的时候,将栈顶复位,正好回到调用函数的作用域。
- 表达式求值(一个栈用于保存操作数,一个栈用于保存运算符)
- 括号匹配