队列的概念:
队列是一种数据结构,它遵循先进先出(First-In-First-Out,FIFO)的原则。在队列中,新元素被添加到队列的末尾,并从队列的开头删除元素。
可以将队列类比为现实生活中排队等候的过程。例如,当你在超市排队结账时,先来的人先被服务,后来的人要等待前面的人完成结账才能轮到自己。
队列具有两个基本操作:入队(enqueue):1.将元素添加到队列的末尾。2.出队(dequeue):从队列的开头移除元素
循环队列:
但是在现实社会中,大部分人使用队列并不是单纯的使用普通队列,使用普通队列存储数据会造成数据量过大,造成内存不足,这时我们就要引用循环队列了。循环队列是一种使用数组实现的队列数据结构,其特点是在队列的内部使用了循环的方式来管理元素。循环队列解决了顺序队列中出队操作导致队列前部空间浪费的问题。
结构:
代码实现:
typedef struct //定义队列的结点
{
Elemtype data[MAXSIZE];
Elemtype front,rear; //队头与队尾的索引
}Queue;
其中front指针始终指向队头,而rear始终指向队尾。
入队:
在入队之前,我们最先要做的事就是先判断队列是否满了,防止出现内存溢出的情况,而判断是否为满可以通过(q.rear+1)%MAXSIZE==q.front,如果返回true说明需要进行出队操作了。
代码实现:
//入队
void Push(Queue &q,int n)
{
if((q.rear+1)%MAXSIZE==q.front) //判断队列是否为满
{
cout<<"队满了,请先出队!!"<<endl;
return;
}
q.data[q.rear]=n;
q.rear=(q.rear+1)%MAXSIZE; //进队操作,队尾的移动规律,防止假溢出
cout<<"入队成功!\n\n";
}
出队:
同理,在出队之前,我们最先要做的事就是先判断队列是否空了,防止出现无数据出的情况,而判断是否为满可以通过q.rear==q.front,如果返回true说明需要进行入队操作了。
代码实现:
void Pop(Queue &q)
{
if(q.front==q.rear)
{
cout<<"队已空,请先入队!!"<<endl;
return;
}
int e;
e=q.data[q.front]; //将出队的值赋予e
q.front=(q.front+1)%MAXSIZE; //出队操作,队头向后防止假溢出
cout<<"出队的元素是:"<<e<<endl<<endl;
}
源码:
#include<iostream>
using namespace std;
#define MAXSIZE 5
typedef int Elemtype;
typedef struct //定义队列的结点
{
Elemtype data[MAXSIZE];
Elemtype front,rear; //队头与队尾的索引
}Queue;
void Initqueue(Queue &q) //初始化
{
q.front=q.rear=0;
}
//入队
void Push(Queue &q,int n)
{
if((q.rear+1)%MAXSIZE==q.front) //判断队列是否为满
{
cout<<"队满了,请先出队!!"<<endl;
return;
}
q.data[q.rear]=n;
q.rear=(q.rear+1)%MAXSIZE; //进队操作,队尾的移动规律,防止假溢出
cout<<"入队成功!\n\n";
}
//出队
void Pop(Queue &q)
{
if(q.front==q.rear)
{
cout<<"队已空,请先入队!!"<<endl;
return;
}
int e;
e=q.data[q.front]; //将出队的值赋予e
q.front=(q.front+1)%MAXSIZE; //出队操作,队头向后防止假溢出
cout<<"出队的元素是:"<<e<<endl<<endl;
}
void Getfront(Queue &q)
{
int e;
e=q.data[q.front]; //与上面同理
cout<<"队头的值是:"<<e<<endl;
}
int main()
{
Queue q;
int n;
do
{
cout<<"\t1.初始化\n";
cout<<"\t2.入队\n";
cout<<"\t3.出队\n";
cout<<"\t4.读取队头元素\n";
cout<<"\t0.退出\n";
cout<<"请选择:";
cin>>n;
if(n==1)
{
Initqueue(q);
cout<<"初始化成功!\n\n";
}
if(n==2)
{
int d;
cout<<"请输入入队元素:";
cin>>d;
Push(q,d);
}
if(n==3)
{
Pop(q);
}
if(n==4)
{
Getfront(q);
}
}while(n!=0);
return 0;
}