本章的基本内容是:
两种特殊的线性表——栈和队列
3.1 栈
栈的逻辑结构
(a1, a2, ……, an)
栈的逻辑结构
栈的操作特性:后进先出
注意:栈只是对表插入和删除操作的位置进行了限制,并没有限定插入和删除操作进行的时间。
栈的抽象数据类型定义
ADT Stack
Data
栈中元素具有相同类型及后进先出特性,
相邻元素具有前驱和后继关系
Operation
InitStack
前置条件:栈不存在
输入:无
功能:栈的初始化
输出:无
后置条件:构造一个空栈DestroyStack
前置条件:栈已存在
输入:无
功能:销毁栈
输出:无
后置条件:释放栈所占用的存储空间
Push
前置条件:栈已存在
输入:元素值x
功能:在栈顶插入一个元素x
输出:如果插入不成功,抛出异常
后置条件:如果插入成功,栈顶增加了一个元素
Pop
前置条件:栈已存在
输入:无
功能:删除栈顶元素
输出:如果删除成功,返回被删元素值,否则,抛出异常
后置条件:如果删除成功,栈减少了一个元素
GetTop
前置条件:栈已存在
输入:无
功能:读取当前的栈顶元素
输出:若栈不空,返回当前的栈顶元素值
后置条件:栈不变
Empty
前置条件:栈已存在
输入:无
功能:判断栈是否为空
输出:如果栈为空,返回1,否则,返回0
后置条件:栈不变
endADT
顺序栈类得分明const int MAX_SIZE=100;
template <class DataType>
class seqStack
{
public:
seqStack( ) ;
~seqStack( );
void Push ( DataType x );
DataType Pop ( );
DataType GetTop ( );
bool Empty ( );
private:
DataType data[MAX_SIZE];
int top;
}
两栈共享空间类声明
const intStack_Size=100;
template<class DataType>
classBothStack
{
public:
BothStack( );
~BothStack( );
void Push(inti, DataType x);
DataType Pop(inti);
DataTypeGetTop(inti);
bool Empty(inti);
private:
DataType data[Stack_Size];
int top1,top2;
};
连栈的类声明template<class DataType>
classLinkStack
{
public:
LinkStack( );
~LinkStack( );
void Push(DataType x);
DataType Pop( );
DataTypeGetTop( );
bool Empty( );
private:
Node<DataType>*top;
}
3.2 队列
队列的逻辑结构
队列的逻辑结构
队列的抽象数据类型定义
ADT Queue
Data
队列中元素具有相同类型及先进先出特性,
相邻元素具有前驱和后继关系
Operation
InitQueue
前置条件:队列不存在
输入:无
功能:初始化队列
输出:无
后置条件:创建一个空队列
DestroyQueue
前置条件:队列已存在
输入:无
功能:销毁队列
输出:无
后置条件:释放队列所占用的存储空间
EnQueue
前置条件:队列已存在
输入:元素值x
功能:在队尾插入一个元素
输出:如果插入不成功,抛出异常
后置条件:如果插入成功,队尾增加了一个元素
DeQueue
前置条件:队列已存在
输入:无
功能:删除队头元素
输出:如果删除成功,返回被删元素值
后置条件:如果删除成功,队头减少了一个元素
GetQueue
前置条件:队列已存在
输入:无
功能:读取队头元素
输出:若队列不空,返回队头元素
后置条件:队列不变
Empty
前置条件:队列已存在
输入:无
功能:判断队列是否为空
输出:如果队列为空,返回1,否则,返回0
后置条件:队列不变
endADT
循环队列类的声明const intQueueSize=100;
template<class DataType>
class CirQueue
{
public:
CirQueue( );
~ CirQueue( );
void EnQueue(DataType x);
DataTypeDeQueue( );
DataTypeGetQueue( );
bool Empty( );
private:
DataType data[QueueSize];
int front,rear;
};
练队列类的声明template<class DataType>
classLinkQueue
{
public:
LinkQueue( );
~LinkQueue( );
void EnQueue(DataType x);
DataTypeDeQueue( );
DataTypeGetQueue( );
bool Empty( );
private:
Node<DataType>*front, *rear;
};
链队列的实现——入队
template <class DataType>
void LinkQueue<DataType>::EnQueue(DataType x)
{
s = new Node<DataType>;
s->data = x;
s->next = NULL;
rear->next = s;
rear = s;
}
链队列的实现——出队
template<class DataType>
DataTypeLinkQueue<DataType>::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;
}
循环队列和链队列的比较
时间性能:
空间性能:
本章总结