一、顺序队列的存储结构
#define MAXSIZE 100//队列可能达到的最大长度
typedef int QElemType;
//队列的顺序存储结构
typedef struct
{
QElemType *base;//存储空间的基地址
int front;//头指针
int rear;//尾指针
} SqQueue;
二、循环队列的初始化
算法步骤:
(1)为队列分配一个最大容量为MAXSIZE的数组空间,base指向数组空间的首地址。
(2)头指针和尾指针置为0,表示队列为空。
//循环队列的初始化
int InitQueue(SqQueue &Q)
{
//构造一个空队列Q
Q.base = new QElemType[MAXSIZE];//为队列分配一个最大容量为MAXSIZE的存储空间
if(!Q.base)
{
cout<<"初始化失败!"<<endl;
return 0;
}
Q.front=Q.rear=0;//头指针和尾指针置为0,队列为空
cout<<"初始化成功!"<<endl;
return 1;
}
三、循环队列的入队
算法步骤:
(1)判断队列是否满
(2)将新元素插入队尾
(3)队尾指针加1
//入队
int EnQueue(SqQueue &Q,QElemType e)
{
if((Q.rear+1)%MAXSIZE==Q.front) //尾指针在循环意义上加一等于头指针,表明队满
{
cout<<"入队失败,队满!"<<endl;
return 0;
}
Q.base[Q.rear]=e;//新元素插入队尾
Q.rear=(Q.rear+1)%MAXSIZE;
cout<<"入队成功!"<<endl;
return 1;
}
四、循环队列的出队
算法步骤:
(1) 判断队列是否为空。
(2)保存队头元素。
(3)队头指针加1。
//出队
int DeQueue(SqQueue &Q,QElemType e)
{
//删除Q的队头元素,用e保存并返回
if(Q.rear==Q.front)//队空
{
cout<<"出队失败,队空!"<<endl;
return 0;
}
e=Q.base[Q.front];//保存队头元素
Q.front=(Q.front+1)%MAXSIZE;//队头指针加1
cout<<"出队成功!"<<endl;
return e;
}
五、求队列长度
//求队列长度
int QueueLength(SqQueue &Q)
{
//返回Q的元素个数,即队列长度
return(Q.rear-Q.front+MAXSIZE)%MAXSIZE;
}
六、输入、输出
void InputQueue(SqQueue &Q)
{
cout<<"哈喽啊,shu,你想先让几个元素入队呢:";
int n,in;
cin>>n;
for(int i=1; i<=n; i++)
{
cout<<"请输入第"<<i<<"个入队元素:";
cin>>in;
EnQueue(Q,in);
}
}
void OutPutQueue(SqQueue Q)
{
cout<<"- - - - -"<<endl;
while(Q.front!=Q.rear)
{
cout<<Q.base[Q.front]<<endl;
Q.front=(Q.front+1)%MAXSIZE;//队头指针加1
}
cout<<"- - - - -"<<endl;
}
七、完整代码
#include <iostream>
#define MAXSIZE 100//队列可能达到的最大长度
using namespace std;
typedef int QElemType;
//队列的顺序存储结构
typedef struct
{
QElemType *base;//存储空间的基地址
int front;//头指针
int rear;//尾指针
} SqQueue;
//循环队列的初始化
int InitQueue(SqQueue &Q)
{
//构造一个空队列Q
Q.base = new QElemType[MAXSIZE];//为队列分配一个最大容量为MAXSIZE的存储空间
if(!Q.base)
{
cout<<"初始化失败!"<<endl;
return 0;
}
Q.front=Q.rear=0;//头指针和尾指针置为0,队列为空
cout<<"初始化成功!"<<endl;
return 1;
}
//求队列长度
int QueueLength(SqQueue &Q)
{
//返回Q的元素个数,即队列长度
return(Q.rear-Q.front+MAXSIZE)%MAXSIZE;
}
//入队
int EnQueue(SqQueue &Q,QElemType e)
{
if((Q.rear+1)%MAXSIZE==Q.front) //尾指针在循环意义上加一等于头指针,表明队满
{
cout<<"入队失败,队满!"<<endl;
return 0;
}
Q.base[Q.rear]=e;//新元素插入队尾
Q.rear=(Q.rear+1)%MAXSIZE;//队尾指针加1
cout<<"入队成功!"<<endl;
return 1;
}
//出队
int DeQueue(SqQueue &Q,QElemType e)
{
//删除Q的队头元素,用e保存并返回
if(Q.rear==Q.front)//队空
{
cout<<"出队失败,队空!"<<endl;
return 0;
}
e=Q.base[Q.front];//保存队头元素
Q.front=(Q.front+1)%MAXSIZE;//队头指针加1
cout<<"出队成功!"<<endl;
return e;
}
int GetHead(SqQueue &Q)
{
//返回Q的队头元素,不修改队头指针
if(Q.front!=Q.rear) //队列非空
{
return Q.base[Q.front];//返回队头元素的值,队头指针不变
}
}
void InputQueue(SqQueue &Q)
{
cout<<"哈喽啊,shu,你想先让几个元素入队呢:";
int n,in;
cin>>n;
for(int i=1; i<=n; i++)
{
cout<<"请输入第"<<i<<"个入队元素:";
cin>>in;
EnQueue(Q,in);
}
}
void OutPutQueue(SqQueue Q)
{
cout<<"- - - - -"<<endl;
while(Q.front!=Q.rear)
{
cout<<Q.base[Q.front]<<endl;
Q.front=(Q.front+1)%MAXSIZE;//队头指针加1
}
cout<<"- - - - -"<<endl;
}
int main()
{
SqQueue Q;
InitQueue(Q);
InputQueue(Q);
OutPutQueue(Q);
int L=QueueLength(Q);
cout<<"队列长度为:"<<L<<endl;
//出队
int e;
int out=DeQueue(Q,e);
cout<<out<<endl;
OutPutQueue(Q);
int L1=QueueLength(Q);
cout<<"队列长度为:"<<L1<<endl;
//OutPutQueue(Q);
}