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