#define MAXSIZE 10
typedef struct
{
int data[MAXSIZE];
int head;
int rear;
}loopQueue;
循环队列结构体,尾节点不存放元素。
int getLength_loopQueue(loopQueue *queue)
{
return (queue->rear + MAXSIZE - queue->head) % MAXSIZE;
}
获取长度:循环队列中,空了一格。不用于存放数据。所以长度应该是(尾-头)即可。多了MAXSIZE,是为了处理循环队列,尾节点在数组的位置靠前,而头在尾节点的后面。
bool initQueue(loopQueue *queue)
{
queue->data[0] = 0;
queue->head = 0;
queue->rear = 0;
return true;
}
bool enQueue(loopQueue *queue, int data)
{
if ((queue->rear + 1) % MAXSIZE == queue->head)
{
cout << "队列满!" << endl;
return false;
}
queue->data[queue->rear] = data;
queue->rear = (queue->rear + 1) % MAXSIZE;
return true;
}
入队操作:首先,判断表满的条件是:
(queue->rear + 1) % MAXSIZE == queue->head
而表空的条件是queue->rear==queue->head。
这样子就可以区分开表空和表满了。
在(queue->rear + 1) % MAXSIZE == queue->head的条件下,队列只能储存MAXSIZE-1个元素,最后一个位置不能存入元素。
bool deQueue(loopQueue *queue)
{
if (queue->head == queue->rear)
{
cout << "空!" << endl;
return false;
}
queue->head = (queue->head+1) % MAXSIZE;
return true;
}
void show_Queue(loopQueue queue)
{
if (queue.head == queue.rear)
{
cout << "显示操作:表空!" << endl;
return;
}
for (int i = queue.head; i <= queue.rear-1; i++)
{
cout << queue.data[i] << " ";
}
cout << endl;
return;
}
值得注意的是这个显示所有的遍历操作,i只能循环到queue.rear-1,因为尾节点不存放元素。
void deleteAllQueue(loopQueue *queue)
{
while (deQueue(queue));
}