网站建设与管理规划书,深圳品牌网站推广公司,东莞厚街做网站,河南省住房与建设注册中心网站一、栈
栈#xff08;Stack#xff09;是只允许在一端进行插入或删除操作的线性表。 栈顶#xff1a;线性表允许插入删除的那一端 栈底#xff1a;固定的、不允许进行插入删除的另一端 栈的操作特性可以概括为后进先出#xff08;LIFO#xff09; n个不同的元素进栈Stack是只允许在一端进行插入或删除操作的线性表。 栈顶线性表允许插入删除的那一端 栈底固定的、不允许进行插入删除的另一端 栈的操作特性可以概括为后进先出LIFO n个不同的元素进栈出栈元素不同的排列个数为C2nnn11n!(2n)!n!1n1(2n)!n!(n1)!\frac{C^n_{2n}}{n1}\frac{1}{n!}\frac{(2n)!}{n!}\frac{1}{n1}\frac{(2n)!}{n!(n1)!}n1C2nnn!1n!(2n)!n11n!(n1)!(2n)!卡特兰数
顺序栈
采用顺序存储的栈称为顺序栈利用一组地址连续的存储单元存放自栈底到栈顶的数据元素同时附设一个指针top指示当前栈顶元素的位置。
共享栈
利用栈底位置相对不变的特性可以让两个顺序栈共享一个一维数组空间将两个栈的栈底分别设置在共享空间的两端两个栈顶向共享空间的中间延伸。 共享栈是为了更有效地利用存储空间两个栈的空间相互调节只有在整个存储空间被占满时才发生上溢。
链栈
采用链式存储的栈称为链栈优点是便于多个栈共享存储空间和提升效率不存在栈满上溢的情况。通常采用单链表实现规定所有操作在表头进行。
二、队列
队列Queue只允许在表的一段进行插入而在表的另一端进行删除。 队头Front允许删除的一端。 队尾Rear允许插入的一端。 其特性概括为先进先出FIFO
队列的顺序储存
分配一块连续的存储单元存放队列中的元素并设队头指针front指向队头元素和队尾指针rear指向队尾元素下一个位置
循环队列
将顺序队列臆造为一个环状的空间即把存储队列元素的表从逻辑上视为一个环称为循环队列当队首指针Q.front MAXSIZE - 1后再前进一个位置就自动到0可以利用取余运算。 队头指针front指向队头元素队尾指针rear指向队尾元素的下一个指针。 初始时Q.front Q.rear 0 队首指针进一出队Q.front (Q.front 1) % MAXSIZE 队尾指针进一入队Q.rear (Q.rear 1) % MAXSIZE 队列长度(Q.rear MAXSIZE - Q.front) % MAXSIZE 队空Q.front Q.fear 队满Q.rear 1) % MAXSIZE Q.front 队列的链式存储
队列的链式表示称为链队列实际上是一个同时带有队头指针和队尾指针的单链表。 用单链表表示的链式队列特别适合于数据元素变动较大的情形而且不存在队列满产生溢出的问题。
双端队列
指允许两端都进行入队出队操作的队列其元素的逻辑结构仍是线性结构。
输出受限的双端队列允许在一端进行插入和删除但在另一端只允许插入的双端队列。输入受限的双端队列允许在一端进行插入和删除但在另一端只允许删除的双端队列
三、队列和栈的应用
括号匹配
算法如下 初始设置一个空栈顺序读入括号
若是左括号将其压入栈中若是右括号则将其与栈顶的括号进行匹配 若栈顶是类型相同的左括号使其出栈若栈顶括号类型不匹配则匹配不成功退出程序
当括号序列读取完毕时若栈空则匹配成功否则匹配不成功。
表达式求值
后缀表达式逆波兰表达式
后缀表达式的运算符在操作数的后面在后缀表达式中已考虑了算符的优先级。后缀表达式只有操作数和算符无需括号。 后缀表达式与表达式树的后序遍历序列相同。
算法如下 初始设置一个空栈顺序读入后缀表达式的每一项根据其类型决定操作
若为操作数将其压入栈中若为运算符op连续从栈中弹出两个操作数Y、X进行XopY运算并将结果压入栈中
当表达式的所有项都处理完后栈顶存放的就是最后的计算结果。
栈在递归中的应用
将递归算法转换为非递归算法需要借助栈实现。 但对于单项递归和尾递归可以用迭代的方式消除递归。 尾递归程序中只有一句递归语句且在末尾。 单向递归指程序中的递归语句在本程序操作执行前都已经完成如斐波那契数列。 这样一来它们共同的特点是在化非递归时都没有非要保存的分支路线
队列在层次遍历中的应用
使用队列保存下一步的处理顺序。