实验三、链队列和顺序队列

来源:互联网 发布:mac qq 编辑:程序博客网 时间:2024/06/05 16:22

一、实验目的
1、 熟练掌队列的结构特点,掌握队列的顺序存储和链式存储结构和实现。
2、 学会使用队列解决实际问题。

二、实验内容
1、自己确定结点的具体数据类型和问题规模:
分别建立一个顺序队列和链队列,实现队列的入队和出队操作。

三、代码
顺序队列:

#ifndef CirQueue_H#define CirQueue_Hconst int QueueSize=100;template<class DataType>class CirQueue{    public:        CirQueue(){front=rear=QueueSize=-1;}        ~CirQueue(){}        void EnQueue(DataType x);        DataType DeQueue();        DataType GetQueue();        int Empty(){front==rear?return 1;return 0;}    private:        DataType data[QueueSize];        int front,rear;};#endif;#include"CirQueue.h"template<class DataType>CirQueue<DataType>::CirQueue(){rear=front=QueueSize-1;}template<class DataType>void CirQueue<DataType>::EnQueue(DataType x){    if((rear+1)%QueueSize==front) throw"上溢";        rear=(rear+1)%QueueSize;    data[rear]=x;}template<class DataType>DataType CirQueue<DataType>::DeQueue(){if(rear==front)throw"下溢";front=(front+1)%QueueSize;return data[front];}template<class DataType>DataType CirQueue<DataType>::GetQueue(){    if(rear==front)throw"下溢";    i=(front+1)%QueueSize;    return data[i];}template<class DataType>int CirQueue<DataType>::Empty(){if(front==rear)return 1;elsereturn 0;}#include<iostream>using namespace std;#include"CirQueue.cpp"void main(){CirQueue<int> C;if(C.Empty())cout<<"队列为空"<<endl;elsecout<<"队列非空"<<endl;cout<<"元素8和6执行入队操作:"<<endl;try{C.EnQueue(8);C.EnQueue(6);}catch(char*wrong){cout<<wrong<<endl;}cout<<"查看队头元素:"<<;cout<<"C.GetQueue()"<<endl;cout<<"执行出队操作:"<<endl;try{C.DeQueue();}catch(char*wrong){cout<<wrong<<endl;}cout<<"查看队头元素:"<<endl;cout<<C.GetQueue()<<endl;}

链队列:

#ifndef LinkQueue_H#define LinkQueue_Htemplate<class DataType>struct Node{    DataType data;    Node<DataType>*next;};template<class DataType>class LinkQueue{    public:        LinkQueue();        ~LinkQueue();        void EnQueue(DataType x);        DataType DeQueue();        DataType GetQueue();        int Empty;    private:        Node<DataType>*front,*rear;};#endif;#include"LinkQueue.h"template<class DataType>LinkQueue<DataType>::LinkQueue(){    Node<DataType>*s=NULL;    s=new Node<DataType>;    s->next=NULL;    front=rear=s;}template<class DataType>LinkQueue<DataType>::~LinkQueue{    Node<DataType>*p=NULL;    while(front!=NULL)    {        p=front->next;        delete front;        front=p;    }}template<class DataType>void LinkQueue<DataType>::EnQueue(DataType x){    Node<DataType>*s=NULL;    s=new Node<DataType>;    s->data=x;    s->next=NULL;    rear->next=s;rear=s;}template<class DataType>DataType LinkQueue<DataType>::DeQueue(){    Node<DataType>*p=NULL;    int x;    if(rear==front)throw"下溢";    p=front->next;    x=p->data;    front->next=p->next;    if(p->next==NULL) rear=front;    delete p;    return x;}template<class DataType>DataType LinkQueue<DataType>::GetQueue(){    if(front!=rear)        return front->next->data;}template<class DataType>int LinkQueue<DataType>::Empty(){    if(front==rear)        return 1;    else        return 0;}#include<iostream>using namespace std;#include"LinkQueue.cpp"void main(){    LinkQueue<int>Q;    if(Q.Empty())        cout<<"队列为空"<<endl;    else        cout<<"队列非空"<<endl;    cout<<"元素8和6执行入队操作:"<<endl;    try    {        Q.EnQueue(8);            Q.EnQueue(6);    }    catch(char*wrong)    {        cout<<wrong<<endl;    }    cout<<"查看队头元素:"<<endl;    cout<<Q.GetQueue()<<endl;    cout<<"执行出队操作:"<<endl;    try    {        Q.DeQueue();    }    catch(char*wrong)    {        cout<<wrong<<endl;    }    cout<<"查看队头元素:"<<endl;    cout<<Q.GetQueue()<<endl;}

四、运行结果
顺序队列:
队列为空
元素8和6执行入队操作:
查看队头元素:
8
执行出队操作
查看队头元素:
6
Press any key to continue

链队列:
队列为空
元素8和6执行入队操作:
查看队头元素:
8
执行出队操作
查看队头元素:
6
Press any key to continue

五、心得和总结
通过这次实验,我对链队列和顺序队列有了进一步了解。实验过程中,依然无法完全自主完成,仍然需要借助书本来完成实验。但试验过后对链队列和顺序队列掌握得更清晰。

原创粉丝点击