順序佇列及鏈佇列
一、實驗目的
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.測試結果如上。