栈基础
栈(stack)是一种受限的线性表,后进先出(LIFO)。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。
思考
思考?LeetCode20,有效的括号
LeetCode #20 有效的括号
结论1:在任意⼀个位置上,左括号数量>=右括号数量
结论2:在最后⼀个位置上,左括号数量=右括号数量
根据上述两个结论,程序中只需要记录左括号和右括号的数量即可。
理解:匹配到左括号lnum+1, 匹配到右括号rnum+1,要满足以上结论=>lnum >= rnum
优化:差值-》不用两个变量,用一个差值表示且查找>=0(左括号+1,右括号-1)
==》我们可以把遇到左括号+1抽象成一件事情的发生(进栈),遇到右括号-1相当于一件事情的结束(出栈)===》括号关系和函数执行上下文栈类似
思考:
⼀对括号可以等价为⼀个完整的事件。
左括号可以看作事件的开始(进栈)、右括号可以看作事件的结束(出栈)。
⽽括号序列可以看作事件与事件之间的完全包含关系。
栈可以处理具有完全包含关系的问题。
为什么栈可以处理递归问题,递归是一种完全包含关系-》(执行上下文栈)
栈的典型应用场景
- 场景一、操作系统中的线程栈(线程池中的线程就是用栈存储的)
- 场景二、表达式求值(用栈来求值和用递归本质上没有差别-》递归用的是系统栈)