一、实验目的
熟练掌栈和队列的结构特点,掌握栈和队列的顺序存储和链式存储结构和实现。
二、实验过程
1.循环队列
#ifndef CirQueue_H
#define CirQueue_H
const int QueueSize=100; //定义存储队列元素的数组的最大长度
template //定义模板类CirQueue
class CirQueue
{
public:
CirQueue( ); //构造函数,置空队
~ CirQueue( ); //析构函数
void EnQueue(DataType x); //将元素x入队
DataType DeQueue( ); //将队头元素出队
DataType GetQueue( ); //取队头元素(并不删除)
int Empty( ); //判断队列是否为空
private:
DataType data[QueueSize]; //存放队列元素的数组
int front, rear; //队头和队尾指针,分别指向队头元素的前一个位置
和队尾元素的位置
};
#endif
#include "CirQueue.h"
template
CirQueue::CirQueue( )
{
front=rear=QueueSize-1;
}
template
CirQueue::~CirQueue( )
{
}
template
void CirQueue::EnQueue(DataType x)
{
if ((rear+1) % QueueSize ==front) throw "上溢";
rear=(rear+1) % QueueSize; //队尾指针在循环意义下加1
data[rear]=x; //在队尾处插入元素
}
template
DataType CirQueue::DeQueue( )
{
if (rear==front) throw "下溢";
front=(front+1) % QueueSize; //队头指针在循环意义下加1
return data[front]; //读取并返回出队前的队头元素,注意
队头指针
}
template
DataType CirQueue::GetQueue( )
{
int i;
if (rear==front) throw "下溢";
i=(front+1) % QueueSize; //注意不要给队头指针赋值
return data[i];
}
template
int CirQueue::Empty( )
{
if (front==rear)
return 1;
else
return 0;
}
#include
using namespace std;
#include "CirQueue.cpp"
void main()
{
CirQueueQ;
if (Q.Empty())
cout<<"队列为空"<
2.链队列
#ifndef LinkQueue_H
#define LinkQueue_H
template
struct Node
{
DataType data;
Node*next;
};
template
class LinkQueue
{
public:
LinkQueue();
~LinkQueue();
void EnQueue(DataType x); //将元素x入队
DataType DeQueue(); //将队头元素出队
DataType GetQueue(); //取链队列的队头元素
int Empty(); //判断链队列是否为空
private:
Node*front,*rear;
};
#endif;
#include "LinkQueue.h"
template
LinkQueue::LinkQueue()
{
Node*s=NULL;
s=new Node;
s->next=NULL;
front=rear=s;
}
template
LinkQueue::~LinkQueue()
{
Node*p=NULL;
while(front!=NULL)
{
p=front->next;
delete front;
front=p;
}
}
template
void LinkQueue::EnQueue(DataType x)
{
Node*s=NULL;
s=new Node;
s->data=x; //申请一个数据域为x的结点s
s->next=NULL;
rear->next=s;rear=s; //将结点s插入到队尾
}
template
DataType LinkQueue::DeQueue()
{
Node*p=NULL;
int x;
if(rear==front)throw"下溢";
p=front->next;
x=p->data; //暂存队头元素
front->next=p->next; //将队头元素所在结点摘链
if(p->next==NULL)rear=front; //判断出队前队列长度是否为1
delete p;
return x;
}
template
DataType LinkQueue::GetQueue()
{
if(front!=rear)
return front->next->data;
}
template
int LinkQueue::Empty()
{
if(front==rear)
return 1;
else
return 0;
}
#include
using namespace std;
#include "LinkQueue.cpp"
void main()
{
LinkQueueQ; //创建模板类的实例
if(Q.Empty())
cout<<"队列为空"<
三、实验心得
我发现顺序栈。链栈、顺序队列和链队列之间有许多相似的地方,所以按照书上的部分算法提示,和实验书的源程序,便可以可以写出循环队列的程序,通过实验,可以更对循环队列和链队列之间的区别更加清晰。