栈和队列的适用场景:
- 栈用于先进后出,例如:实现二叉树的迭代法遍历
- 队列用于先进先出,例如:二叉树的层序遍历、图论中的BFS
- 实现函数递归调用就需要栈,递归的实现就是:每一次递归调用都会把函数的局部变量、参数值和返回地址等压入调用栈中,然后递归返回的时候,从栈顶弹出上一次递归的各项参数,所以这就是递归为什么可以返回上一层位置的原因。
适用栈和队列尤其需要注意的点:
在栈中,当我们进行了一个弹出操作pop()或者取栈顶元素top()的时候,我们接下去的操作一定要想着 防止操作空栈 !或者在进行循环之前判断条件里一定要有防止操作空栈的步骤!
栈和队列的底层理解
225.用队列实现栈:栈可以通过 队列实现,通过队列的转圈输入弹出实现栈的 先入后出!一个队列在模拟栈弹出元素的时候只要将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部,此时在去弹出元素就是栈的顺序了。
232.用栈实现队列:队列可以通过两个栈实现,一个输入栈专用于输入数据;一个输出栈专用于输出数据。
对称匹配问题——栈
20.有效的括号:这道题的题目意思是判断成对出现的括号能否以正确的顺序和正确的类型闭合。
那么这些括号排列的方式只有3种:左括号多了;右括号多了;左右括号数量相等但不匹配;做题过程种的技巧:遇到左括号存对应的右括号,方便比较。这种匹配问题适合用栈解决。
1047.删除字符串中的所有相邻重复项:本题要求将字符串中相邻的重复元素删除,直到没有相邻的重复元素。
其实,这题也是匹配问题:1、本题可以用一个栈,将s中的每一项从后向前遍历加入栈中,遇到当前遍历元素与栈顶的元素相同则弹出后,遍历下一个元素,最后将栈中元素一一弹出到新的字符串中,返回;2、也可以用一个string作为容器模拟栈,可以简化后序的转化。
150.逆波兰表达式求值:逆波兰表达式就是表达式后缀法,每一个子表达式要得出一个结果,然后拿这个结果再进行运算,其本质也就是字符串匹配消除问题,即:遇到了数字,将其加入栈中,遇见运算符就取出数进行运算,再加入栈中。