目录
1.循环队列类型定义
1.1不带标志循环队列
typedef struct{ //不带标识队列
int elem[MAXSIZE];
int front,rear;
}SqQueue;
1.2带标志循环队列
typedef struct{ //带标识队列
int elem[MAXSIZE];
int front,rear;
int tag; //带标识队列可多存储一个元素
}SqQueue_t;
2.初始化队列
2.1不带标志循环队列
void InitQueue(SqQueue &Q){ //初始化
Q.front=Q.rear=0;
}
2.2带标志循环队列
void InitQueue_t(SqQueue_t &Qt){ //初始化
Qt.front=Qt.rear=0;
Qt.tag=0;
}
3.入队
3.1不带标志循环队列
bool EnQueue(SqQueue &Q,int x){ //入队
if((Q.rear+1)%MAXSIZE==Q.front) //队尾在队首前一个元素为满
return false;
Q.elem[Q.rear]=x;
Q.rear=(Q.rear+1)%MAXSIZE;
return true;
}
3.2带标志循环队列
bool EnQueue_t(SqQueue_t &Qt,int x){ //入队
if(Qt.rear==Qt.front&&Qt.tag==1) //队尾在队首前一个元素为满
return false;
Qt.elem[Qt.rear]=x;
Qt.rear=(Qt.rear+1)%MAXSIZE;
if(Qt.tag==0)
Qt.tag=1; //标识队列非空
return true;
}
4.出队
4.1不带标志循环队列
bool DelQueue(SqQueue &Q,int &x){ //出队
if(Q.rear==Q.front)
return false;
x=Q.elem[Q.front];
Q.front=(Q.front+1)%MAXSIZE;
return true;
}
4.2带标志循环队列
bool DelQueue_t(SqQueue_t &Qt,int &x){ //出队
if(Qt.rear==Qt.front&&Qt.tag==0)
return false;
x=Qt.elem[Qt.front];
Qt.front=(Qt.front+1)%MAXSIZE;
if(Qt.rear==Qt.front)
Qt.tag==0; //标识队列已为空
return true;
}
5.查看队列长度
5.1不带标志循环队列
int LengthQueue(SqQueue Q){ //队列长度
int length=(Q.rear-Q.front+MAXSIZE)%MAXSIZE;
return length;
}
5.2带标志循环队列
int LengthQueue_t(SqQueue_t Qt){ //队列长度
if(Qt.front==Qt.rear&&Qt.tag==1)
return MAXSIZE;
else{
int length=(Qt.rear-Qt.front+MAXSIZE)%MAXSIZE;
return length;
}
}
6.遍历输出队列内所有元素(两种队列相同)
void PrintQueue(SqQueue Q){ //遍历
if(Q.front<Q.rear){
for(int i=Q.front;i<Q.rear;i++)
printf("%4d",Q.elem[i]);
}
else{
for(int i=Q.front;i<Q.rear+MAXSIZE;i++)
printf("%4d",Q.elem[i%MAXSIZE]);
}
printf("\n");
}
7.完整代码
#include <stdio.h>
#define MAXSIZE 5
typedef struct{ //不带标识队列
int elem[MAXSIZE];
int front,rear;
}SqQueue;
typedef struct{ //带标识队列
int elem[MAXSIZE];
int front,rear;
int tag; //带标识队列可多存储一个元素
}SqQueue_t;
//*****************不带标识队列算法**************************
void InitQueue(SqQueue &Q){ //初始化
Q.front=Q.rear=0;
}
bool EnQueue(SqQueue &Q,int x){ //入队
if((Q.rear+1)%MAXSIZE==Q.front) //队尾在队首前一个元素为满
return false;
Q.elem[Q.rear]=x;
Q.rear=(Q.rear+1)%MAXSIZE;
return true;
}
bool DelQueue(SqQueue &Q,int &x){ //出队
if(Q.rear==Q.front)
return false;
x=Q.elem[Q.front];
Q.front=(Q.front+1)%MAXSIZE;
return true;
}
int LengthQueue(SqQueue Q){ //队列长度
int length=(Q.rear-Q.front+MAXSIZE)%MAXSIZE;
return length;
}
void PrintQueue(SqQueue Q){ //遍历
if(Q.front<Q.rear){
for(int i=Q.front;i<Q.rear;i++)
printf("%4d",Q.elem[i]);
}
else{
for(int i=Q.front;i<Q.rear+MAXSIZE;i++)
printf("%4d",Q.elem[i%MAXSIZE]);
}
printf("\n");
}
//*****************带标识队列算法**************************
void InitQueue_t(SqQueue_t &Qt){ //初始化
Qt.front=Qt.rear=0;
Qt.tag=0;
}
bool EnQueue_t(SqQueue_t &Qt,int x){ //入队
if(Qt.rear==Qt.front&&Qt.tag==1) //队尾在队首前一个元素为满
return false;
Qt.elem[Qt.rear]=x;
Qt.rear=(Qt.rear+1)%MAXSIZE;
if(Qt.tag==0)
Qt.tag=1; //标识队列非空
return true;
}
bool DelQueue_t(SqQueue_t &Qt,int &x){ //出队
if(Qt.rear==Qt.front&&Qt.tag==0)
return false;
x=Qt.elem[Qt.front];
Qt.front=(Qt.front+1)%MAXSIZE;
if(Qt.rear==Qt.front)
Qt.tag==0; //标识队列已为空
return true;
}
int LengthQueue_t(SqQueue_t Qt){ //队列长度
if(Qt.front==Qt.rear&&Qt.tag==1)
return MAXSIZE;
else{
int length=(Qt.rear-Qt.front+MAXSIZE)%MAXSIZE;
return length;
}
}
void PrintQueue_t(SqQueue_t Qt){ //遍历
if(Qt.front<Qt.rear){
for(int i=Qt.front;i<Qt.rear;i++)
printf("%4d",Qt.elem[i]);
}
else{
for(int i=Qt.front;i<Qt.rear+MAXSIZE;i++)
printf("%4d",Qt.elem[i%MAXSIZE]);
}
printf("\n");
}
int main(){
int x;
//不带标识队列算法
SqQueue Q;
InitQueue(Q);
for(;;){
scanf("%d",&x);
if(x==-1)
break;
EnQueue(Q,x);
}
PrintQueue(Q);
DelQueue(Q,x);
printf("出队元素:%d\n",x);
PrintQueue(Q);
x=LengthQueue(Q);
printf("队列长度:%d\n",x);
printf("****************\n");
//带标识队列算法
SqQueue_t Qt;
InitQueue_t(Qt);
for(;;){
scanf("%d",&x);
if(x==-1)
break;
EnQueue_t(Qt,x);
}
PrintQueue_t(Qt);
DelQueue_t(Qt,x);
printf("出队元素:%d\n",x);
PrintQueue_t(Qt);
x=LengthQueue_t(Qt);
printf("队列长度:%d\n",x);
//二次入队,尝试队尾循环至队头前面
DelQueue_t(Qt,x);
printf("出队元素:%d\n",x);
PrintQueue_t(Qt);
for(;;){
scanf("%d",&x);
if(x==-1)
break;
EnQueue_t(Qt,x);
}
PrintQueue_t(Qt);
return 0;
}