数据结构》队列(2) 循环队列 完整源码
#include <iostream>
#include <windows.h>
using namespace std;
#define MAX_SIZE 10
typedef int ElemType;
typedef struct squeue{
ElemType *data;
int front;
int rear;
}SqQueue;
bool init_queue(SqQueue &q);
bool en_queue(SqQueue &q,ElemType data);
bool de_queue(SqQueue &q,ElemType &data);
bool judge_empty(SqQueue q);
bool judge_full(SqQueue q);
bool traverse_queue(SqQueue q);
bool clear_queue(SqQueue &q);
bool get_length(SqQueue q,int &length);
bool get_head(SqQueue q,ElemType &data);
void show();
void switch_channel(int channel);
SqQueue q;
ElemType data;
int n,i;
int main()
{
int channel;
do{
show();
cout<<"输入操作:";
cin>>channel;
switch_channel(channel);
cout<<endl;
}while(1);
return 0;
}
void show()
{
cout<<"循环队列操作"<<endl;
cout<<"1--初始化、入队元素"<<endl;
cout<<"2--元素出队"<<endl;
cout<<"3--输出队头元素"<<endl;
cout<<"4--队列长度"<<endl;
cout<<"5--清空队列"<<endl;
}
void switch_channel(int channel)
{
switch(channel)
{
case 1:{
init_queue(q);
cout<<"请输入要入队列元素的数目:";
cin>>n;
for(i = 0; i < n; i++)
{
cout<<"请输入第"<<i+1<<"个元素:";
cin>>data;
en_queue(q,data);
}
traverse_queue(q);
}break;
case 2:{
de_queue(q,data);
cout<<"出队列元素为:"<<data<<endl;
traverse_queue(q);
}break;
case 3:{
get_head(q,data);
cout<<"列头元素为:"<<data<<endl;
traverse_queue(q);
}break;
case 4:{
get_length(q,n);
cout<<"当前队列长度为:"<<n<<endl;
}break;
case 5:{
clear_queue(q);
traverse_queue(q);
}break;
default:exit(1);break;
}
}
bool init_queue(SqQueue &q)
{
q.data = new ElemType[MAX_SIZE];
if(!q.data)
{
cout<<"初始化失败"<<endl;
return false;
}
q.front = q.rear = 0;
cout<<"初始化完成"<<endl;
return true;
}
bool en_queue(SqQueue &q,ElemType data)
{
if(judge_full(q))
{
cout<<"队列已满"<<endl;
return false;
}
q.data[q.rear] = data;
q.rear = (q.rear + 1) % MAX_SIZE;
return true;
}
bool de_queue(SqQueue &q,ElemType &data)
{
if(judge_empty(q))
{
cout<<"队列为空"<<endl;
return false;
}
data = q.data[q.front];
q.front = (q.front + 1) % MAX_SIZE;
return true;
}
bool judge_empty(SqQueue q)
{
if(q.front == q.rear)
return true;
return false;
}
bool judge_full(SqQueue q)
{
if((q.rear+1) % MAX_SIZE == q.front)
return true;
return false;
}
bool traverse_queue(SqQueue q)
{
if(judge_empty(q))
{
cout<<"遍历队列--队列为空"<<endl;
return false;
}
cout<<"遍历队列:";
while(q.front != q.rear)
{
cout<<q.data[q.front]<<" ";
q.front = (q.front + 1) % MAX_SIZE;
}
cout<<endl;
return true;
}
bool clear_queue(SqQueue &q)
{
q.front = q.rear = 0;
cout<<"清空完成"<<endl;
return true;
}
bool get_length(SqQueue q,int &length)
{
if(judge_empty(q))
{
cout<<"队列为空"<<endl;
return false;
}
length = (q.rear - q.front + MAX_SIZE) % MAX_SIZE;
return true;
}
bool get_head(SqQueue q,ElemType &data)
{
if(judge_empty(q))
{
cout<<"队列为空"<<endl;
return false;
}
data = q.data[q.front];
return true;
}