1.要会判断队满:
if((Q.rear+1)%MAXQSIZZE == Q.front){//判断队满
return ERROR;
}
2.判断队空
if (Q.front == Q.rear) return ERROR;//判断队空
3.获取队长
j = (Q.rear - Q.front + MAXQSIZZE) % MAXQSIZZE;
4.队头后移和队尾后移要注意,移动要怎么写?(重要!)
Q.front = (Q.front + 1) % MAXQSIZZE;//让队头元素后移
Q.rear = (Q.rear + 1) % MAXQSIZZE;//取余是为了在队尾时加一可以回到头,形成循环
下面上代码:
#include<stdio.h>
#include<stdlib.h>
#define MAXQSIZZE 100
#define OK 1
#define ERROR 0
#define OVERFLOW -2
int i, n, e, j, x, num;
//队列看成循环队列,通过少放一个元素来解决假上溢
typedef struct {
int* base;//指向数组名的指针,代表数组第一个元素的地址
int front;//队头元素的下标
int rear;//队尾元素的下标
}SqQueue;
//1.循环队列的初始化
int InitSqQueue_Q(SqQueue &Q) {
Q.base = (int*)malloc(MAXQSIZZE * sizeof(SqQueue));//分配数组的空间
if (!Q.base)exit(OVERFLOW);
Q.front = Q.rear = 0;//让队列为空
return 0;
}
//2.循环队列入队(元素e入队)
int EnQueue_Q(SqQueue &Q,int e) {
if((Q.rear+1)%MAXQSIZZE == Q.front){//判断队满
return ERROR;
}
Q.base[Q.rear] = e;//把元素e插入到队列里面的数组下标为Q.rear的位置,也就是队尾
Q.rear = (Q.rear + 1) % MAXQSIZZE;//取余是为了在队尾时加一可以回到头,形成循环
return OK;
}
//2.循环队列出队(出队元素用e返回)
int DeQueue_Q(SqQueue& Q,int &e) {
if (Q.front == Q.rear) return ERROR;//判断队空
e = Q.base[Q.front];//保存队头元素
Q.front = (Q.front + 1) % MAXQSIZZE;//让队头元素后移
return OK;
}
//3.获取队长
int SqQueueLength_Q(SqQueue& Q,int &j) {
j = (Q.rear - Q.front + MAXQSIZZE) % MAXQSIZZE;
return j;
}
//4.取队头元素
int GetHead_Q(SqQueue &Q,int &e) {
if (Q.front == Q.rear) {
printf("队空");
return ERROR;
}
e = Q.base[Q.front];
return OK;
}
int main() {
SqQueue Q;
InitSqQueue_Q(Q);
printf("请输入初始队列元素个数:");
scanf("%d", &n);
printf("输入队列元素:");
for (i = 0; i < n; i++) {
scanf("%d", &e);
EnQueue_Q(Q, e);
printf("%d", e);
}
GetHead_Q(Q, e);
printf("\n队头元素为:%d",e);
printf("\n请输入出队的个数:");
scanf("%d", &x);
printf("出队的元素为:");
for (i = 0; i < x; i++) {
DeQueue_Q(Q, e);
printf("%d", e);
}
SqQueueLength_Q(Q,j);
printf("\n出队后的元素个数剩下:%d", j);
printf("\n出队后的循环队列为:");
for (i = 0; i < j; i++) {
printf("%d", Q.base[Q.front]);
Q.front = (Q.front + 1) % MAXQSIZZE;
}
return 0;
}