第三章 栈和队列

来源:互联网 发布:小学生阅读软件下载 编辑:程序博客网 时间:2024/05/29 03:07

栈和队列

一、      栈

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;

}

 

 

 

0 0
原创粉丝点击