栈和队列
栈
栈(Stack)是限制在表的一端进行插入和删除运算的线性表,通常称插入、删除的这一端为
栈顶(Top),另一端为栈底(Bottom)。先进后出。top= -1 时为空栈,top=0 只能说明栈
中只有一个元素,并且元素进栈时 top 应该自增
顺序存储栈:顺序存储结构
链栈:链式存储结构。插入和删除操作仅限制在链头位置上进行。栈顶指针就是链表的头
指针。通常不会出现栈满的情况。 不需要判断栈满但需要判断栈空。
两个栈共用静态存储空间,对头使用也存在空间溢出问题。栈 1 的底在 v[1],栈 2 的底在
V[m],则栈满的条件是 top[1]+1=top[2]。
基本操作:删除栈顶元素、判断栈是否为空以及将栈置为空栈等
对于 n 各元素的入栈问题,可能的出栈顺序有 C(2n,n)/(n+1)个。
堆栈溢出一般是循环的递归调用、大数据结构的局部变量导致的
应用,代码:
进制转换
括号匹配的检验
行编辑程序
迷宫求解:若当前位置“可通”,则纳入路径,继续前进;若当前位置“不可通”,则后退,换
方向继续探索;若四周“均无通路”,则将当前位置从路径中删除出去。
表达式求解:前缀、中缀、后缀。
操作数之间的相对次序不变;
运算符的相对次序不同;
中缀式丢失了括弧信息,致使运算的次序不确定
前缀式的运算规则为:连续出现的两个操作数和在它们之前且紧靠它们的运算符构成一个最
小表达式
后缀式的运算规则为:运算符在式中出现的顺序恰为表达式的运算顺序;每个运算符和在它
之前出现且紧靠它的两个操作数构成一个最小表达式。
实现递归:多个函数嵌套调用的规则是:后调用先返回。
浏览器 历史 纪录, Android 中的最 近任务, Activity 的启 动模式, CPU 中栈的 实现
Word 自动保存,解析计算式,解析 xml/json。解析 XML 时,需要校验节点是否闭合,
节点闭合的话,有头尾符号相对应,遇到头符号将其放入栈中,遇到尾符号时,弹出栈的
内容,看是否有与之对应的头符号,栈的特性刚好符合符号匹配的就近原则。
不是所有的递归程序都需要栈来保护现场,比方说求阶乘的,是单向递归,直接用循环去
替代从 1 乘到 n 就是结果了,另外一些需要栈保存的也可以用队列等来替代。不是所有的
递归转化为非递归都要用到栈。转化为非递归主要有两种方法:对于尾递归或单向递归,
可以用循环结构算法代替