typedef struct {
datatype data[maxsize];
int front;
int rear;
} SeQueue;
void InitQueue(SeQueue *&sq) {
sq = (SeQueue *)malloc(sizeof(SeQueue));
sq->front = sq->rear = 0;
}
void SetNull (SeQueue *sq) {
sq->front = sq->rear = 0;
}
int Length (SeQueue *sq) {
return (sq->rear - sq->front + maxsize) % maxsize;
}
int EnQueue(SeQueue *sq, datatype x)
{
if (sq->front == (sq->rear + 1) % maxsize) {
printf("队列上溢");
return (0);
} else {
sq->rear = (sq->rear + 1) % maxsize;
sq->data[sq->rear] = x;
return (1);
}
}
int DeQueue (SeQueue *sq, datatype &x)
{
if (sq->front == sq->rear) {
printf("队列下溢");
return (0);
} else {
sq->front = (sq->front + 1) % maxsize;
x = sq->data[sq->front];
return (1);
}
}
int GetFront (SeQueue *sq, datatype &x)
{
if (sq->front == sq->rear) {
printf("队列下溢");
return (0);
} else {
x = sq->data[(sq->front + 1) % maxsize];
return (1);
}
}
void RankSeQueue(datatype a[], int n) {
SeQueue *Q[2];
InitQueue(Q[0]);
InitQueue(Q[1]);
int k = 0, j;
datatype t;
EnQueue(Q[k], a[0]);
int i;
for (i = 1; i < n; i++) {
j = (k + 1) % 2;
GetFront(Q[k], t);
while (Q[k]->front != Q[k]->rear && a[i] > t) {
DeQueue(Q[k], t);
EnQueue(Q[j], t);
if (Q[k]->front != Q[k]->rear)
GetFront(Q[k], t);
}
EnQueue(Q[j], a[i]);
while (Q[k]->front != Q[k]->rear) {
DeQueue(Q[k], t);
EnQueue(Q[j], t);
}
k = j;
}
while ((Q[k]->front != Q[k]->rear)) {
DeQueue(Q[k], t);
printf("%5d", t);
}
printf("\n");
}
int main() {
int k, n = maxsize - 1;
datatype a[n];
for (k = 0; k < n; k++) {
a[k] = n - k;
}
printf("数组元素从小到大输出为:\n");
RankSeQueue(a, n);
return 0;
}