——如阅读体验不佳,可转为横屏阅读;如微信无法横屏,可尝试文末方法。
线性表
串的匹配(KMP算法)
栈
栈:栈是限定只能在表的一端进行插入和删除操作的线性表。可插入和删除的一端称为栈顶,另一端称为栈底。
实现方法:只需令该单指针为链表的头指针指向栈的栈顶,则在链表头部的插入和删除即可实现栈顶的入栈和栈顶的出栈。
实现方法:依次读取表达式中的项,若该项为操作符则执行操作符栈相关的操作,若该项为操作数则执行操作数栈相关的操作,直至表达式读完。
操作符栈:①栈外操作符的优先级大于栈顶操作符的优先级,则压栈,栈外表达式指向下一字符;②栈外操作符的优先级等于栈顶操作符的优先级,则弹栈,栈外表达式仍指向当前字符;③栈外操作符的优先级小于栈顶操作符的优先级,则弹栈,栈外表达式仍指向当前字符;(助记:优先级越大,权重越重,只有栈外的优先级大于栈顶的优先级时才可以“压住”,即入栈,其他情况均出栈。)
操作数栈:①读取的操作数逐一入栈;②操作符栈执行一次②或③,操作数栈弹出两个操作数,并将计算结果压入操作数栈。
实现方法:顺序扫描表达式,操作数直接顺序存入后缀表达式的尾部;操作符执行操作符栈相关的操作,每执行一次操作③,则将弹出的操作符存入后缀表达式的尾部。
操作符栈:①栈外操作符的优先级大于栈顶操作符的优先级,则压栈,栈外表达式指向下一字符;②栈外操作符的优先级等于栈顶操作符的优先级,则弹栈,栈外表达式仍指向当前字符;③栈外操作符的优先级小于栈顶操作符的优先级,则弹栈,栈外表达式仍指向当前字符;(助记:优先级越大,权重越重,只有栈外的优先级大于栈顶的优先级时才可以“压住”,即入栈,其他情况均出栈。)
队列
队列:队列是限定只能在表的一端进行插入操作和在另一端进行删除操作的线性表。可插入的一端称为队尾,可删除的一端称为队头。
缓存空间与其上的循环队列的关系图
如图所示,存储空间(即定长数组)的缓存长度buffLen = 10,绿色区域表示循环队列占用的空间,循环队列的起始位置begin = 5,循环队列的最大长度maxLen = 7。
起始位置和最大长度均可变的循环队列在固定长度的缓存空间中存储时的下一索引的计算公式:
公式说明:
表达式
:表示循环队列的输入索引在循环队列中的相对位置;
表达式
:表示循环队列的输入索引的下一位置在循环队列中的相对位置;
表达式
:表示循环队列的输入索引的下一位置在缓存空间(即数组)中的相对位置。
实现方法:只需令该单指针为链表的尾指针指向队列的尾结点,则在链表尾部的插入和头部的删除即可实现队尾的入队和队首的出队。
实现方法:令栈S1为输入栈,S1的压栈模拟队列的入队;栈S2为输出栈,S2的退栈模拟队列的出队。则
(1)队列为空的条件是:栈S1和栈S2均为空;(即无法执行队列的出队操作(4))
(2)队列已满的条件是:栈S1已满且栈S2非空;(即无法执行队列的入队操作(3))
(3)队列的入队操作是:栈S1压栈(当S1已满且S2为空时,先将S1中的元素逐个退栈并按退栈次序逐个压入S2,再将入队元素压入S1实现入队);
(4)队列的出队操作是:栈S2退栈(当S2已空且S1非空时,先将S1中的元素逐个退栈并按退栈次序逐个压入S2,再对S2执行退栈操作实现出队)。
双端队列
双端队列:双端队列是限定插入和删除操作都可在表的两端进行的线性表。(同一元素的插入端和删除端可以不同,即从一端插入的元素可以从任意一端删除。)
在输入(输出)受限的双端队列中,只能在不受限的一端插入(删除)。——可选择“【右上角···】→【在浏览器中打开】”进行横屏阅读。