循环队列的基本操作实现
预备知识
判断队空:Q.frontQ.rear
判断队满:(Q.rear+1)%MAXSIZEQ.front
队头加一:Q->front- (Q->front+l) MAXSIZE;
队尾加一:q->rear=(q->rear + 1) % LENGTH;
计算队长:(q.rear-q.front+LENGTH)%LENGTH;
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 10
//队列的顺序存储结构
typedef struct SqQueue{
int *base;
int front;
int rear;
}SqQueue;
// 初始化
int InitSqQueue(SqQueue *q){
q->base=(int*)malloc(MAXSIZE*sizeof(int));
if(!q->base){
return 0;
}
q->front=q->rear=0;
printf("初始化成功!\n");
return 1;
}
//返回队列的长度
int Queuelength(SqQueue q){
return (q.rear-q.front+MAXSIZE)%MAXSIZE;
}
//入队
int EnQueue(SqQueue *q){
int e;
//判断是否队满
if((q->rear+1)%MAXSIZE==q->front){
printf("队满\n");
return 0;
}
printf("请输入入队元素\n");
scanf("%d",&e);
q->base[q->rear]=e;
q->rear=(q->rear+1)%MAXSIZE;
printf("入队成功\n");
return 0;
}
//出队
int OutQueue(SqQueue *q){
//判断是否为空
if(q->front==q->rear){
printf("队列为空!\n");
return 0;
}
printf("%d出队\n", q->base[q->front]);
q->front=(q->front+1)%MAXSIZE;
return 1;
}
//取队头元素
int getQueueFront(SqQueue q){
if(q.front!=q.rear){//非空
return q.base[q.front];
}else{
printf("队列为空\n");
}
}
//取队尾元素
int getQueueRear(SqQueue q){
if(q.front==q.rear){//空
printf("队列为空\n");
}
if(q.rear==0){
q.rear=MAXSIZE-1;
return q.base[q.rear];
}
q.rear--;
return q.base[q.rear];
}
//判断队是否为空
void isEmpty(SqQueue q){
if(q.front==q.rear){//为空
printf("队列为空\n");
}else{
printf("不为空\n");
}
}
//判断队是否为满
void isFull(SqQueue q){
if((q.rear+1)%MAXSIZE==q.front){//已满
printf("队列已满\n");
}else{
printf("队列未满\n");
};
}
//遍历队列
void bianli(SqQueue q){
while(q.front!=q.rear){
printf("%d ",q.base[q.front]);
q.front=(q.front+1)%MAXSIZE;
}
printf("\n");
}
int main(){
SqQueue Q;
int k,j;
while (1) {
printf("1.入队\n");
printf("2.出队\n");
printf("3.初始化\n");
printf("4.求队列长度\n");
printf("5.取队头元素\n");
printf("6.取队尾元素\n");
printf("7.判断是否为空\n");
printf("8.判断是否队满\n");
printf("9.遍历队列\n");
printf("请输入你的选择\n");
scanf("%d", &k);
switch (k) {
case 1:EnQueue(&Q); break;
case 2:OutQueue(&Q); break;
case 3:InitSqQueue(&Q);break;
case 4:j=Queuelength(Q);printf("队列长度为%d\n",j);break;
case 5:j=getQueueFront(Q);printf("队头元素为%d\n",j);break;
case 6:j=getQueueRear(Q);printf("队尾元素为%d\n",j);break;
case 7:isEmpty(Q);break;
case 8:isFull(Q);break;
case 9:bianli(Q);break;
}
}
return 0;
}
若有不足或建议欢迎在评论区指出。