实验四:顺序队列(循环队列)和链队列

来源:互联网 发布:知乎如何删除话题 编辑:程序博客网 时间:2024/05/19 13:08

一、实验目的

熟练掌栈和队列的结构特点,掌握栈和队列的顺序存储和链式存储结构和实现。



二、实验过程

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;  }  #includeusing namespace std;#include "CirQueue.cpp"void main(){CirQueueQ;if (Q.Empty())cout<<"队列为空"<




2.链队列
#ifndef LinkQueue_H#define LinkQueue_Htemplatestruct Node{DataType data;Node*next;};templateclass LinkQueue{public:LinkQueue();~LinkQueue();void EnQueue(DataType x);  //将元素x入队DataType DeQueue();        //将队头元素出队DataType GetQueue();       //取链队列的队头元素int Empty();               //判断链队列是否为空private:Node*front,*rear;};#endif;#include "LinkQueue.h"templateLinkQueue::LinkQueue(){Node*s=NULL;s=new Node;s->next=NULL;front=rear=s;}templateLinkQueue::~LinkQueue(){Node*p=NULL;while(front!=NULL){p=front->next;delete front;front=p;}}templatevoid LinkQueue::EnQueue(DataType x){Node*s=NULL;s=new Node;s->data=x;                 //申请一个数据域为x的结点ss->next=NULL;rear->next=s;rear=s;      //将结点s插入到队尾}templateDataType 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; //判断出队前队列长度是否为1delete p;return x;}templateDataType LinkQueue::GetQueue(){if(front!=rear)return front->next->data;}templateint LinkQueue::Empty(){if(front==rear)return 1;elsereturn 0;}#includeusing namespace std;#include "LinkQueue.cpp"void main(){LinkQueueQ;       //创建模板类的实例if(Q.Empty())cout<<"队列为空"<




三、实验心得

我发现顺序栈。链栈、顺序队列和链队列之间有许多相似的地方,所以按照书上的部分算法提示,和实验书的源程序,便可以可以写出循环队列的程序,通过实验,可以更对循环队列和链队列之间的区别更加清晰。

原创粉丝点击