※栈(限制插入/删除数据的位置)
3.2.1
1.栈的定义
栈是只能在表的一端进行插入删除操作的线性表,允许插入(入栈)和删除(出栈)的一端称为栈顶,另一端称为栈底,不含有任何数据元素的栈称为空栈。
后进先出,即任何时刻出栈的元素都只能是栈顶元素。
设置指示器,记录栈顶位置。
2.栈的抽象数据类型定义(stack)
栈的初始化(构建空栈) 栈的销毁 插入 删除 取栈顶元素 判空
3.2.2 栈的顺序存储结构及实现
1.顺序栈的存储结构
通常把数组元素下表为0的一端作为栈底,附设top变量指向栈顶元素所在数组中的下标
设栈数组长度为stacksize,则设栈为空时栈顶位置top=-1,栈满时栈顶位置为top=stacksize-1。入栈时栈顶位置top+;出栈时栈顶位置top-1.
2.顺序栈的实现
const int StackSize = 10; //10是示例性的数据,根据实际问题具体定义
template <typename DataType> //定义模板类SeqStack
class SeqStack
{
public:
SeqStack( ); //构造函数,初始化一个空栈
~SeqStack( ); //析构函数
void Push( DataType x ); //入栈操作,将元素x入栈
DataType Pop( ); //出栈操作,将栈顶元素弹出
DataType GetTop( ); //取栈顶元素(并不删除)
int Empty( ); //判断栈是否为空
private:
DataType data[StackSize]; //存放栈元素的数组
int top; //游标,栈顶指针,为栈顶元素在数组中的下标
};
①构造函数——顺序栈初始化
将栈顶指针top置为-1.
②析构函数为空
③入栈操作
插入元素x需要将栈顶位置top+1,然后在top的位置填入x。
template <typename DataType>
void SeqStack<DataType> :: Push(DataType x)
{
if (top == StackSize - 1) throw "上溢";
data[++top] = x;
}
④出栈操作
取出栈顶元素,然后栈顶位置top-1.
template <typename DataType>
DataType SeqStack<DataType> :: Pop( )
{
DataType x;
if (top == -1) throw "下溢";
x = data[top--];
return x;
}
⑤取栈顶元素
将top位置的栈顶元素取出并返回
template <typename DataType>
DataType SeqStack<DataType> :: GetTop( )
{
if(top == -1)
throw "下溢异常";
else
return data[top];
}
⑥判空操作
判断top是不是-1
template <typename DataType>
int SeqStack<DataType> :: Empty()
{
if(top == -1)
return 1;
else
return 0;
}
3.2.3栈的链接存储结构及实现
1.栈链的存储结构
因为只能在栈顶执行插入和删除操作,故以单链表头部做栈顶方便而且没必要设置头结点。
2.操作
构造函数(链栈的初始化)
析构函数
入栈操作(只需要处理栈顶)
出栈操作(只需处理栈顶)
取栈顶元素 (只需返回栈顶指针top所指结点的数据域,并不修改栈顶指针)
判空操作(判断top指针是否为空)
3.2.4 顺序栈和链栈的比较
元素个数变化较大用链栈,反之用顺序栈。
※队列
3.3.1 队列的逻辑结构
队列是只允许在一端进行插入操作(入队,队尾),在另一端进行删除操作(出队,队头)的线性表。
特点:先进先出
3.3.2 队列的顺序存储结构及实现
1.队列的顺序存储结构(顺序队列)
设置队头队尾两个位置变量front和rear。入队时入队时rear加1,出队时front加1。规定:front指向队头元素的前一个位置,rear指向队尾元素的位置。
2.循环队列的存储结构
作用:解决假溢出问题 假溢出:当元素被插入到数组中下标最大的位置后,数组空间就备用尽了,但此时数组低端还有空闲空间。
方法:拖尾相接,即允许队列直接从数组下边最大的位置延续到下标最小的位置。可以通过取余实现。设存储队列的数组长度为QueueSize,操作语句为rear=(rear+1)%QueueSize
判断队空/队满:front=rear 为了区分队空队满,可以浪费一个存储空间,使队尾和队首位置相差为1,即 (rear+1)% QueueSize=front
3.3.3 队列的链式存储结构及实现
1.链队列的存储结构
为使空队列和非空队列操作一样,设置头结点。
根据先入先出特性,设置队头(删除)指针指向链队列的头结点,队尾(插入)指针指向终端节点。
2.链队列的实现
出队操作时,出队后判断出队前队列长度是否为1 :if(p-next=nullptr) rear=front;