一、实验目的
1.掌握队列的链接存储结构—链队列以及顺序存储结构—顺序队列
2.验证链队列的存储结构和基本的实现
3.验证队列的操作特性。
二、实验内容
1.建立一个空队列
2.对已建立的队列进行插入、删除、取队头元素等操作
三、设计与编码
1.理论知识
定义链队列和顺序队列的数据类型如入队出队去队头等操作,利用了队列元素的线性关系和先进先出的特性。
2.算法设计
链队列验证实验
#ifndef LinkQueue_H
#define LinkQueue_H
template<class DataType>
struct Node
{
DataTypedata;
Node<DataType>*next;
};
template<class DataType>
class LinkQueue
{
public:
LinkQueue();
~LinkQueue();
voidEnQueue(DataType x);
DataTypeDeQueue();
DataTypeGetQueue();
intEmpty();
private:
Node<DataType>*front,*rear;
};
#endif;
#include"LinkQueue.h"
template<class DataType>
LinkQueue<DataType>::LinkQueue()
{
Node<DataType>*s=NULL;
s=newNode<DataType>;
s->next=NULL;
front=rear=s;
}
template<class DataType>
LinkQueue<DataType>::~LinkQueue()
{
Node<DataType>*p=NULL;
while(front!=NULL)
{
p=front->next;
deletefront;
front=p;
}
}
template<class DataType>
void LinkQueue<DataType>::EnQueue(DataTypex)
{
Node<DataType>*s=NULL;
s=newNode<DataType>;
s->data=x;
s->next=NULL;
rear->next=s;rear=s;
}
template<class DataType>
DataTypeLinkQueue<DataType>::DeQueue()
{
Node<DataType>*p=NULL;
intx;
if(rear==front)throw"下溢";
p=front->next;
x=p->data;
front->next=p->next;
if(p->next==NULL)rear=front;
deletep;
returnx;
}
template<class DataType>
DataTypeLinkQueue<DataType>::GetQueue()
{
if(front!=rear)
returnfront->next->data;
}
template<class DataType>
int LinkQueue<DataType>::Empty()
{
if(front==rear)
return1;
else
return0;
}
#include<iostream>
using namespace std;
#include"LinkQueue.cpp"
void main()
{
LinkQueue<int>.Q;
if(Q.Empty())
cout<<"队列已空"<<endl;
else
cout<<"队列非空"<<endl;
cout<<"元素100,32,69执行入队操作"<<endl;
try
{
Q.EnQueue(100);
Q.EnQueue(32);
Q.EnQueue(69);
}
catch(char*wrong)
{
cout<<wrong<<endl;
}
cout<<"查看队头元素"<<endl;
cout<<Q.GetQueue()<<endl;
cout<<"执行出队操作,并将23入队"<<endl;
try
{
Q.DeQueue();
Q.EnQueue(23);
}
catch(char*wrong)
{
cout<<wrong<<endl;
}
cout<<"查看队头元素"<<endl;
cout<<Q.GetQueue()<<endl;
}
顺序队列验证实验
#include <iostream>
using namespace std;
template <class DataType>
class Queue{
private:
int front;
int rear;
int MaxSize;
DataType *data;
int number;
public:
Queue(int max=10):MaxSize(max)
{
front=0;
rear=0;
number=0;
data = new DataType[MaxSize];
}
~Queue(){
delete [] data;
}
void EnQueue(DataType x);
void DeQueue();
DataType GetQueue() const;
int getLength() const;
bool Full() const;
bool Empty() const;
void Display() const;
};
template <class DataType>
voidQueue<DataType>::EnQueue(DataType x)
{
data[rear]=x;
rear=(rear+1)%MaxSize;
number++;
}
template <class DataType>
void Queue<DataType>::DeQueue()
{
front=(front+1)%MaxSize;
number--;
}
template <class DataType>
DataType Queue<DataType>::GetQueue()const
{
return data[front];
}
template <class DataType>
int Queue<DataType>::getLength()const
{
return number;
}
template <class DataType>
bool Queue<DataType>::Full()const
{
return number==MaxSize;
}
template <class DataType>
bool Queue<DataType>::Empty()const
{
return number==0;
}
template <class DataType>
void Queue<DataType>::Display() const
{
int p = front;
int i=1;
while(p!=rear)
{
cout<<"第"<<i<<"元素:"<<data[p]<<endl;
i++;
p = (p+1)%MaxSize;
}
}
void main(){
Queue<int> *a = new Queue<int>(5);
cout<<"队列是否为空:"<<a->Empty()<<endl;
cout<<"输入元素9,65,69,47,56"<<endl;
a->EnQueue(9);
a->EnQueue(65);
a->EnQueue(69);
a->EnQueue(47);
a->EnQueue(56);
a->Display();
cout<<"队列是否已满:"<<a->Full()<<endl;
cout<<"队列元素个数:"<<a->getLength()<<endl;
cout<<"第一个元素出队"<<endl;
a->DeQueue();
cout<<"队列元素个数:"<<a->getLength()<<endl<<endl;
a->Display();
}
四、运行与调试
1.遇到问题为如何建立链队列的指针以及出队入队操作,通过查阅书本
2.测试结果如上。