栈和队列
从数据结果的定义看,栈和队列也是一种线性表。其与线性表不同之处在于栈和队列的相关运算具有特殊性,只是线性表相关运算的一个子集。一般线性表插入、删除运算不受限制,而栈和队列上的插入、删除运算均受某种特殊限制。
栈和队列也称作操作受限的线性表。
栈
栈是最常用的和最重要的数据结构之一,用途十分广泛(如二叉树、递归算法转非递归算法)。
栈(后进先出表)是一种只能在一端进行插入或删除操作的线性表。表中允许进行插入、删除操作的一端称为栈顶。栈顶的当前位置是动态的,由一个称为栈顶指针的位置指示器指示。表的另一端称为栈底。栈中没有数据元素时,称为空栈。栈的插入操作通称压栈或进栈,栈的删除操作通称退栈或出栈。
栈的主要特点:“后进先出”,即后进栈的元素先弹出。每次进栈的数据元素都放在当前栈顶元素之前成为新的栈顶元素,每次出栈的数据元素都是当前栈顶元素。
ADT Stack
{
数据对象:D={ai|1≤i≤n,n≥0,ai 为ElemType类型}//ElemType是自定义的类型标识符
数据关系:R={< ai,ai+1>| ai,ai+1∈D,i=1,…,n-1}
基本运算:初始化,销毁,判断空栈,近栈,出栈,取栈顶元素
}
采用顺序存储的栈称为顺序栈。
采用链式存储的栈称为链栈。优点:不存在栈满上溢的情况。
队列
队列也有广泛的应用,特别是在操作系统资源分配和排队论中,大量地使用队列。
队列(先进先出表)简称队,仅允许在表的一端进行插入,而在表的另一端进行删除。把进行插入的一端称作队尾(rear),进行删除的一端称作队头或队首(front)。向队列中插入新元素称为进队或入队,新元素进队后就成为新的队尾元素;从队列中删除元素称为出队或离队,元素出队后,其直接后继元素就成为队首元素。
队列的主要特点:插入和删除分别在各自一端进行,每个元素必然按照进队次序出队。
front指针指向队首元素(实际是队首前一个位置),rear指向队尾位置(正好是队尾元素)
ADT Queue
{
数据对象:D={ai|1≤i≤n,n≥0,ai 为ElemType类型}//ElemType是自定义的类型标识符
数据关系:R={< ai,ai+1>| ai,ai+1∈D,i=1,…,n-1}
基本运算:初始化,销毁,判断空队,近队,出队
}
采用顺序存储的队列称为顺序队。将数组前后连接形成环形顺序表成为环形队列(循环队列)。
采用链式存储的队列称为链队。
双端队列:两端都可以进行进队和出队操作的队列,将队列两端称为前端和后端。
输入受限的双端队列,一端只允许出;输出受限的双端队列,一端只允许进。
若限定双端队列只能哪里进哪里出,就蜕变成两个栈底相邻的栈了。