/*
循环队列(数组实现)
2018.12.10
*/
#include<stdio.h>
#define MAXSIZE 10 //顺序表实现的循环队列要损失一个结点空间
//所以 最多可以入队 MAXSIZE-1 个元素
typedef struct
{
int data[MAXSIZE];
int front;
int rear;
}SequenceQueue;
//初始化队
void initQueue(SequenceQueue *qu)
{
qu->front = qu->rear = 0; //初始化队列 front == rear
}
//队判空
int isEmpty(SequenceQueue qu)
{
if (qu.front == qu.rear)return 1; //队列判空 当 front == rear时为空
else return 0;
}
//队判满
int isFull(SequenceQueue qu)
{
if ((qu.rear + 1) % MAXSIZE == qu.front)return 1; //队列判满 当 rear在front后一个位置的时候 //
else return 0; //因为 front始终指向的是 空结点
}
//入队
int enQueue(SequenceQueue *qu, int element)
{
if ((qu->rear + 1) % MAXSIZE == qu->front)return 0;//队满无法入队
//入队操作:先移动指针,之后存入元素
qu->rear = (qu->rear + 1) % MAXSIZE;
qu->data[qu->rear] = element;
return 1;
}
//出队
int deQueue(SequenceQueue *qu)
{
if (qu->front == qu->rear)return 0;//队空无法出队
int element;//出队的元素
//出队操作:先移动指针,之后去除元素
qu->front = (qu->front + 1) % MAXSIZE;
element = qu->data[qu->front]; //front总是指向 空结点
return element;
}
//打印队
void printQueue(SequenceQueue qu)
{
printf("队首->队尾:");
do
{
qu.front++;
printf("%d ", qu.data[qu.front]);
} while (qu.front != qu.rear);
printf("\n");
}
int main()
{
SequenceQueue qu;
initQueue(&qu);
int element;
int number;
printf("请输入将要入队的元素的个数(最大为%d):", MAXSIZE - 1);
scanf("%d", &number);
printf("请输入将要入队的元素(空格隔开):");
while (number--)
{
scanf("%d", &element);
enQueue(&qu, element);
}
printQueue(qu);
printf("请输入将要出队的元素的个数:");
scanf("%d", &number);
printf("出队的序列为:");
while (number--)
{
element = deQueue(&qu);
printf("%d ", element);
}
printf("\n");
printQueue(qu);
if (isEmpty(qu))printf("队列为空\n");
else printf("队列非空\n");
if (isFull(qu))printf("队列满");
else printf("队列不满");
return 0;
}