一、 栈
(1)栈的定义:栈是限定仅在表尾进行插入和删除操作的线性表,允许插入和删除的一端称为栈顶,另一端称为栈底,不含任何数据元素的栈称为空栈。
(2)在任何时候出栈的元素都只能是栈顶元素,即最后最后入栈者最先出栈。所以栈中元素除了具有线性关系外,还具有后进先出的特性。
(3) 栈的抽象数据类型定义:
ADT Stack
Data
栈中元素具有相同类型及后进先出特性,相邻元素具有前驱和后继关系
Operation
Initstack
前置条件:栈不存在
输入:无
功能:栈的初始化
输出:无
后置条件:构造一个空栈
Destroystack
前置条件:栈已存在
输入:无
功能:销毁栈
输出:无
后置条件:释放栈所占用的存储空间
Push
前置条件:栈已存在
输入:元素值x
功能:入栈操作,在栈顶插入一个元素x
输出:如果插入不成功,则抛出异常
后置条件:如果插入成功,则栈顶增加一个元素
Pop
前置条件:栈已存在
输入:无
功能:出栈操作,删除栈顶元素
输出:如果删除成功,返回被删元素值,否则,抛出异常
后置条件:如果删除成功,则栈顶减少了一个元素
GetTop
前置条件:栈已存在
输入:无
功能:取栈顶元素,读取当前的栈顶元素
输出:若栈不空,返回当前的栈顶元素值
后置条件:栈不变
Empty
前置条件:栈已存在
输入:无
功能:判空操作,判断栈是否为空
输出:如果站为空,返回1,否则返回0
后置条件:栈不变
endADT
(4)栈的顺序存储结构称为顺序栈
1、顺序栈入站算法Push
template<classDT>
VoidSeqstack<DT>::Push(DTx)
{
If(top==StackSize-1)throw”上溢”;
Data[++top]=x;
}
2、顺序栈出栈算法Pop
template<classDT>
DTSeqstack<DT>::Pop()
{
If(top==-1)throw”下溢”;
3、两栈共享空间入栈算法Push
template<classDT>
voidBothstack<DT>::Push(intI,DTx)
{
If(top1==top2-1)throw”上溢”;
If(i==1)data[++top1]=x;
If(i==2)data[--top2]=x;
}
4、两栈共享空间出栈算法Pop
template<classDT>
DTBothstack<DT>::Pop(inti)
{
if(i==1){
if(top1==-1)throw”下溢”;
returndata[top1--];
}
If(i==2){
If(top2==stacksize)throw”下溢”;
returndata[top2++];
}
}
(5) 栈的链接存储结构称为链栈
1、链栈入栈算法Push
template<classDT>
voidLinkstack<DT>::Push(DTx)
{
S=newNode;s->data=x;
s->next=top;top=s;
}
2、链栈入栈算法Pop
template<classDT>
DTLinkstack<DT>::Pop()
{
If(top==NULL)throw”下溢”;
X=top->data;p=top;
Top=top->next;
Deletep;
Returnx;
}
二、 队列
(1) 队列的定义:队列是只允许在一端进行插入操作,在另一端进行删除操作的线性表。允许插入的一端称为队尾,允许删除的一端称为对头。队列中的元素除了具有线性关系外,还具有先进先出的特性。
(2)队列的顺序存储结构----循环队列
1、循环队列入队算法EnQueue
template<classDT>
VoidCirQueue<DT>::EnQueue(DT X)
{
If((rear+1)%QueueSize==front)throw”上溢”;
rear=(rear+1)%QueueSize;
data[rear]=x;
}
2、循环队列出队算法DeQueue
template<classDT>
DTCirQueue<DT>::DeQueue()
{
if(rear==front)throw”下溢”;
Front=(front+1)%QueueSize;
Returndata[front];
}
3、读取队头元素算法GetQueue
template<classDT>
DTCirQueue<DT>::GetQueue()
{
if(rear==front)throw”下溢”;
i=(front+1)%QueueSize;
returndata[i];
}
(3)队列的链接存储结构----链队列
1、链队列构造函数算法LinkQueue
template<classDT>
LinkQueue<DT>::LinkQueue()
{
s=new Node;s->next=NULL;
Front=rear=s;
}
2、链队列入队算法EnQueue
template<classDT>
voidLinkQueue<DT>::EnQueue(DTx)
{
S=newNode;s->data=x;
s->next=s;
rear=s;
}
3、链队列出队算法DeQueue
template<classDT>
DTLinkQueue<DT>::DeQueue()
{
if(rear==front)throw”下溢”;
p=front->next;x=p->data;
front->next=p->next;
if(p->next==NULL)rear=front;
deletep;
returnx;
}