队列有顺序历队列和循环度列两种格式
将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。存储在其中的队列称为循环队列(Circular Queue)
循环队列代码实现:
#include <iostream>
#include <stdlib.h>
#define maxqsize 5
#define ok 1
#define error -1
#define overflow -3
using namespace std;
typedef struct
{
int *base;
int front;
int rear;
} Squeue;
int InitQueue(Squeue &Q)
{
Q.base = (int *)malloc(maxqsize * sizeof(int));
if (!Q.base)
exit(overflow);
Q.front = Q.rear = 0;
return ok;
}
void DestroyQueue(Squeue &Q)
{
if (Q.base)
free(Q.base);
Q.base = NULL;
Q.front = Q.rear = 0;
}
void ClearQueue(Squeue &Q)
{
Q.front = Q.rear = 0;
}
int QueueEmpty(Squeue Q)
{
if (Q.front == Q.rear)
return 1;
else
return -1;
}
int QueueLength(Squeue Q)
{
return (Q.rear - Q.front + maxqsize) % maxqsize;
}
int GetHead(Squeue Q, int &e)
{
if (Q.front == Q.rear)
return error;
e = Q.base[Q.front];
return ok;
}
int EnQueue(Squeue &Q, int e)
{
if ((Q.rear + 1) % maxqsize == Q.front)
return error;
Q.base[Q.rear] = e;
Q.rear = (Q.rear + 1) % maxqsize;
return ok;
}
int DeQueue(Squeue &Q, int &e)
{
if (Q.front == Q.rear)
return error;
e = Q.base[Q.front];
Q.front = (Q.front + 1) % maxqsize;
return ok;
}
void QueueTraverse(Squeue Q)
{
int i;
i = Q.front;
while (i != Q.rear)
{
cout << Q.base[i] << " ";
i = (i + 1) % maxqsize;
}
cout << endl;
}
int main()
{
int i = 0, j, n;
Squeue Q;
InitQueue(Q);
cout << "after init queue,whether the queue is empty(1:empty -1:not empty):" << QueueEmpty(Q) << endl;
cout << "please input number of queue(-100 means the queue ended):" << endl;
do
{
cin >> n;
if (n == -100)
break;
i++;
EnQueue(Q, n);
} while (i < maxqsize);
cout << "thr length of queue is:" << QueueLength(Q) << endl;
cout << "after init queue,whether the queue is empty(1:empty -1:not empty):" << QueueEmpty(Q) << endl;
DeQueue(Q, n);
cout << "the number deleted is:" << n << endl;
cout << "thr length of queue is:" << QueueLength(Q) << endl;
j = GetHead(Q, n);
if (j)
cout << "the head of the queue is:" << n << endl;
ClearQueue(Q);
cout << "after init queue,whether the queue is empty(1:empty -1:not empty):" << QueueEmpty(Q) << endl;
DestroyQueue(Q);
system("pause");
}
结果如下: