4.2.循环队列功能实现
循环队列特点
0.循环队列类的定义实现
//队列的顺序存储
#include<iostream>
using namespace std;
typedef int Elemtype;
#define MAX_SIZE 25
class queue{
private:
int head;
int rear;
Elemtype *data;
int size;
int cnt;//计数
public:
//1.队列的无参构造函数
queue();
//2.队列的有参构造函数
queue(int s);
//3.队列的析构函数
~queue();
//4.入队操作
void push(Elemtype t);
//5.出队操作
bool pop(Elemtype&k);
//6.判断队列是否为空
bool isEmpty();
//7.判断队列是否满了
bool isFull();
//8.返回队尾元素
Elemtype GetRear();
//9.返回队头元素
Elemtype GetHead();
//10.清空队列
void Clear();
//11.打印队列
void PrintQueue();
};
1.循环队列的无参构造函数
//1.队列的无参构造函数
queue::queue()
{
cnt=0;
head=0;
rear=-1;
size=MAX_SIZE;
data=new Elemtype[size];
}
2.循环队列的有参构造函数
//2.队列的有参构造函数
queue::queue(int s)
{
head=0;
rear=-1;
cnt=0;
if(size>MAX_SIZE)
{
size=MAX_SIZE;
data=new Elemtype[size];
}
else
{
size=s;
data=new Elemtype[size];
}
}
3.循环队列的析构函数
//3.队列的析构函数
queue::~queue()
{
delete []data;
}
4.循环队列入队操作
//4.入队操作
void queue::push(Elemtype t)
{
if(!isFull())
{
rear=(rear+1)%size;
data[rear]=t;
cnt++;
}
else
{
cout<<"队列已满"<<endl;
return ;
}
}
5.循环队列出队操作
//5.出队操作
bool queue::pop(Elemtype&k)
{
if(!isEmpty())
{
k=data[head];
head=(head+1)%size;
cnt--;
return true;
}
else
return false;
}
6.循环队列判断队列是否为空
//6.判断队列是否为空
bool queue::isEmpty()
{
return cnt==0;
}
7.循环队列判断队列是否满了
//7.判断队列是否满了
bool queue::isFull()
{
return cnt==MAX_SIZE;
}
8.循环队列返回队尾元素
//8.返回队尾元素
Elemtype queue::GetRear()
{
if(!isEmpty())
{
return data[rear];
}
return 0;
}
9.循环队列返回队头元素
//9.返回队头元素
Elemtype queue::GetHead()
{
if(!isEmpty())
{
return data[head];
}
return 0;
}
10.循环队列清空队列
//10.清空队列
void queue::Clear()
{
head=-1;
rear=-1;
cnt=0;
}
11.循环队列打印队列
//11.打印队列
void queue::PrintQueue()
{
if(!isEmpty())
{
int p=head;
int q=rear;
while(p%size!=q)
{
cout<<data[p]<<" ";
p=(p+1)%size;
}
cout<<endl;
}
}
12.循环队列测试案例
//12.测试案例
void test01()
{
int k;
queue Queue;
Queue.push(56);
Queue.push(59);
Queue.push(98);
Queue.push(15);
Queue.push(46);
Queue.push(78);
cout<<"队头元素为:"<<Queue.GetHead()<<endl;
cout<<"队尾元素为:"<<Queue.GetRear()<<endl;
cout<<"打印队列元素:";
Queue.PrintQueue();
Queue.pop(k);
cout<<"弹出元素:"<<k<<endl;
cout<<"打印队列元素:";
Queue.PrintQueue();
}
5.循环队列总源码
//队列的顺序存储
#include<iostream>
using namespace std;
typedef int Elemtype;
#define MAX_SIZE 25
class queue{
private:
int head;
int rear;
Elemtype *data;
int size;
int cnt;//计数
public:
//1.队列的无参构造函数
queue();
//2.队列的有参构造函数
queue(int s);
//3.队列的析构函数
~queue();
//4.入队操作
void push(Elemtype t);
//5.出队操作
bool pop(Elemtype&k);
//6.判断队列是否为空
bool isEmpty();
//7.判断队列是否满了
bool isFull();
//8.返回队尾元素
Elemtype GetRear();
//9.返回队头元素
Elemtype GetHead();
//10.清空队列
void Clear();
//11.打印队列
void PrintQueue();
};
//1.队列的无参构造函数
queue::queue()
{
cnt=0;
head=0;
rear=-1;
size=MAX_SIZE;
data=new Elemtype[size];
}
//2.队列的有参构造函数
queue::queue(int s)
{
head=0;
rear=-1;
cnt=0;
if(size>MAX_SIZE)
{
size=MAX_SIZE;
data=new Elemtype[size];
}
else
{
size=s;
data=new Elemtype[size];
}
}
//3.队列的析构函数
queue::~queue()
{
delete []data;
}
//4.入队操作
void queue::push(Elemtype t)
{
if(!isFull())
{
rear=(rear+1)%size;
data[rear]=t;
cnt++;
}
else
{
cout<<"队列已满"<<endl;
return ;
}
}
//5.出队操作
bool queue::pop(Elemtype&k)
{
if(!isEmpty())
{
k=data[head];
head=(head+1)%size;
cnt--;
return true;
}
else
return false;
}
//6.判断队列是否为空
bool queue::isEmpty()
{
return cnt==0;
}
//7.判断队列是否满了
bool queue::isFull()
{
return cnt==MAX_SIZE;
}
//8.返回队尾元素
Elemtype queue::GetRear()
{
if(!isEmpty())
{
return data[rear];
}
return 0;
}
//9.返回队头元素
Elemtype queue::GetHead()
{
if(!isEmpty())
{
return data[head];
}
return 0;
}
//10.清空队列
void queue::Clear()
{
head=-1;
rear=-1;
cnt=0;
}
//11.打印队列
void queue::PrintQueue()
{
if(!isEmpty())
{
int p=head;
int q=rear;
while(p%size!=q)
{
cout<<data[p]<<" ";
p=(p+1)%size;
}
cout<<endl;
}
}
//12.测试案例
void test01()
{
int k;
queue Queue;
Queue.push(56);
Queue.push(59);
Queue.push(98);
Queue.push(15);
Queue.push(46);
Queue.push(78);
cout<<"队头元素为:"<<Queue.GetHead()<<endl;
cout<<"队尾元素为:"<<Queue.GetRear()<<endl;
cout<<"打印队列元素:";
Queue.PrintQueue();
Queue.pop(k);
cout<<"弹出元素:"<<k<<endl;
cout<<"打印队列元素:";
Queue.PrintQueue();
}
int main()
{
test01();
}
循环队列测试结果