本题考查循环队列的应用。
循环队列是队列的一种顺序表示和实现方法。可节省大量空间。
本题中要求使用域变量rear(即队尾)和length(即队长)编写程序。这样做可规避一般循环队列的小缺陷,即不用预留一个空间来判断是否队满。
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int *data;
int rear;
int length;
int n;
}QueueNode;
QueueNode seq;
int IsEmpty(QueueNode *q); //队列判空
int IsFull(QueueNode *q); //队列判满
void Push(QueueNode *q, int item); //入队
void Pull(QueueNode *q, int* out); //出队
void PrintQueue(QueueNode *q); //输出队列元素及队首
QueueNode CreateQueue(int m);
int main()
{
int m;
scanf("%d", &m);
seq = CreateQueue(m);
while(1) {
int tmp;
scanf("%d", &tmp);
Push(&seq, tmp);
char c;
c = getchar();
if (c == '\n') {
break;
}
}
char str[5];
scanf("%s", str);
int out, out_tmp;
scanf("%d", &out);
Pull(&seq, &out_tmp);
while(out != out_tmp) {
Pull(&seq, &out_tmp);
}
PrintQueue(&seq);
return 0;
}
QueueNode CreateQueue(int m)
{
QueueNode *q;
q = (QueueNode*) malloc (sizeof(QueueNode));
q->data = (int*) malloc (sizeof(int)*m);
q->rear = 0;
q->length = 0;
q->n = m;
return *q;
}
int IsEmpty(QueueNode *q)
{ //队列判空
if(q->length == 0) {
return 1;
}
else return 0;
}
int IsFull(QueueNode *q)
{ //队列判满
if(q->length == q->n) {
return 1;
}
else return 0;
}
void Push(QueueNode *q, int item)
{ //入队
if(IsEmpty(q)) {
q->length++;
q->data[q->rear] = item;
return;
}
if(IsFull(q)) {
return;
}
else {
q->length++;
q->rear = (q->rear + 1) % q->n;
q->data[q->rear] = item;
}
}
void Pull(QueueNode *q, int* out)
{ //出队
if(IsEmpty(q)) {
return;
}
int tmp;
tmp = (q->rear + q->n - q->length + 1) % q->n;//队首所在
*out = q->data[tmp];
q->length--;
}
void PrintQueue(QueueNode *q)
{ //输出队列元素及队首
if(IsEmpty(q)) {
return;
}
int tmp;
tmp = (q->rear + q->n - q->length + 1) % q->n;
while (tmp != q->rear) {
printf("%d ", q->data[tmp]);
tmp = (tmp + 1) % q->n;
}
printf("%d ", q->data[tmp]);
tmp = (q->rear + q->n - q->length + 1) % q->n;
printf("\n%d ", q->data[tmp]);
}