
/* 若希望循环队列中的元素都能得到利用,则需设置一个标志域tag,并以tag 的值为0或1来区分队头指针front和队尾指针rear 相同时的队列状态是“空”还是“满”。试编写此结构相应的入队和出队算法。 分析:*/#include <stdio.h>#include <stdlib.h>#define TYPE int struct Squeue { TYPE *arr; int front, rear; int tag;};//创建队列Squeue *create(int n) { struct Squeue *sq = (struct Squeue *)malloc(sizeof(struct Squeue)); sq->arr = (TYPE *)malloc(sizeof(TYPE)*n);//数组大小 sq->front = 0; sq->rear = 0; sq->tag = 0; return sq;}//判断队满bool isFull(Squeue *sq, int maxSize) { return (sq->rear == sq->front) && (sq->tag == 1);}//判断队空bool isEmpty(Squeue *sq) { return (sq->front == sq->rear) && sq->tag==0;}//判断队列中元素个数int count(Squeue *sq, int maxSize) { return (sq->rear - sq->front + maxSize) % maxSize;}//入队bool enQueue(Squeue *sq, int data, int maxSize) { if (isFull(sq, maxSize)) return false; sq->arr[sq->rear] = data; sq->rear = (sq->rear + 1) % maxSize; sq->tag = 1; return true;}//出队bool deQueue(Squeue *sq, int &data, int maxSize) { if (isEmpty(sq)) return false; data = sq->arr[sq->front]; sq->front = (sq->front + 1) % maxSize; sq->tag = 0; return true;}