#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
typedef struct _queue
{
int *buffer;
unsigned int front;
unsigned int rear;
unsigned int size;
}queue;
//初始化循环队列
int initQueue(queue *Q, unsigned int size)
{
Q->buffer = (int*)malloc(size * sizeof (int));
if(!Q->buffer)
return 0;
Q->size = size;
Q->front = 0;
Q->rear = 0;
return 1;
}
//队列尾部插入
int push_back(queue *Q, int n)
{
if((Q->rear + 1) % Q->size == Q->front)
return 0;
Q->buffer[Q->rear] = n;
Q->rear = (Q->rear + 1) % Q->size;
return 1;
}
//队列头部插入
int push_front(queue *Q, int n)
{
if((Q->front - 1 + Q->size) % Q->size == Q->rear)
return 0;
Q->front = (Q->front - 1 + Q->size) % Q->size;
Q->buffer[Q->front] = n;
return 1;
}
//队列头部出队
int pop_front(queue *Q, int *x)
{
if(Q->front == Q->rear)
return 0;
*x = Q->buffer[Q->front];
Q->front = (Q->front + 1) % Q->size;
return 1;
}
//队尾出队
int pop_back(queue *Q, int *x)
{
if(Q->front == Q->rear)
return 0;
Q->rear = (Q->rear - 1 + Q->size) % Q->size;
*x = Q->buffer[Q->rear];
return 1;
}
//遍历队列
void traverseQueue(queue *Q)
{
unsigned int idx = Q->front;
while(idx != Q->rear)
{
printf("%d ", Q->buffer[idx]);
idx = (idx+1) % Q->size;
}
printf("\r\n");
}
//是否是空队列
bool isEmptyQueue(queue *Q)
{
return Q->front == Q->rear;
}
//是否是满队列
bool isFullQueue(queue *Q)
{
return (Q->rear + 1) % Q->size == Q->front;
}
//清除队列元素
void clearQueue(queue *Q)
{
Q->front = 0;
Q->rear = 0;
}
//释放队列
void deleteQueue(queue *Q)
{
free(Q->buffer);
}
int main()
{
queue Q;
int x;
initQueue(&Q, 5);
for(int i = 0; i < 5; i++)
push_back(&Q, i);
pop_front(&Q, &x);
printf("%d\r\n", x);
traverseQueue(&Q);
deleteQueue(&Q);
return 0;
}