一、实验目的
熟练掌栈和队列的结构特点,掌握栈和队列的顺序存储和链式存储结构和实现。
二、实验过程
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() { CirQueue
Q; 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() { LinkQueue
Q; //创建模板类的实例 if(Q.Empty()) cout<<"队列为空"<
三、实验心得
我发现顺序栈。链栈、顺序队列和链队列之间有许多相似的地方,所以按照书上的部分算法提示,和实验书的源程序,便可以可以写出循环队列的程序,通过实验,可以更对循环队列和链队列之间的区别更加清晰。