解题思路:
这道题要求对一个循环队列,进行入队、出队和判满等操作,我们先了解一下比较常规的循环队列。
以下是一个常见的循环队列的宏定义:
typedef struct {
int *base
;
int front
;
int rear
;
} SqQueue
;
然而,我们这道题要求的循环队列没有front成员,而是增加了length成员,这其实也无妨,我们能找到front与length之间的关系,来实现相互表示,其关系是:(front+length-1)%N==rear。 接下来,我们就按题目要求进行操作即可,注意两点,一是循环队列需要留出一个空储存单元用于判空,二是在进行成员的运算后要注意进行求余操作(最好理解一下)。 具体操作见代码,代码中有部分注释。
题解代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int *data
;
int length
;
int rear
;
int N
;
}Queue
;
void CreatQueue(Queue
*Q
, int n
){
Q
->N
= n
+1;
Q
->data
= (int*)malloc(sizeof(int)*(Q
->N
));
Q
->length
= Q
->rear
= 0;
}
void AddElem(Queue
*Q
, int num
){
if((Q
->rear
+1)%(Q
->N
)==(Q
->rear
-Q
->length
)%Q
->N
){
return;
}
else{
Q
->rear
= (Q
->rear
+1)%(Q
->N
);
Q
->data
[Q
->rear
] = num
;
Q
->length
++;
}
}
int DeleteFrontElem(Queue
*Q
){
Q
->length
--;
return Q
->data
[(Q
->rear
-Q
->length
)%(Q
->N
)];
}
int PopFrontElem(Queue
*Q
){
return Q
->data
[Q
->rear
-Q
->length
+1];
}
int main(){
int n
,i
,len
,OutNum
;
int A
[1000];
char yesOrNo
[5];
scanf("%d",&n
);
Queue
*Q
;
Q
= (Queue
*)malloc(sizeof(Queue
));
CreatQueue(Q
,n
);
for(i
=0;;i
++){
scanf("%d",&A
[i
]);
char c
= getchar();
if(c
=='\n'){
break;
}
}
len
= i
+1;
for(i
=0;i
<len
&&i
<n
;i
++){
AddElem(Q
,A
[i
]);
}
scanf("%s",&yesOrNo
);
scanf("%d",&OutNum
);
while(PopFrontElem(Q
)!=OutNum
){
DeleteFrontElem(Q
);
}
DeleteFrontElem(Q
);
int new_front
= PopFrontElem(Q
);
while(Q
->length
!=0){
printf("%d ",DeleteFrontElem(Q
));
}
printf("\n%d",new_front
);
return 0;
}