#include <stdio.h>
#include <stdbool.h>
#define MAX_SIZE 100001
//循环队列
typedef struct
{
int data[MAX_SIZE];
int front; //队首指针
int rear; //队尾指针
} Queue;
//typedef struct
//{
// Node* front;
// Node* rear;
//} Queue;
//初始化队列
void initQueue(Queue* q)
{
q->front = q->rear = 0;
}
//判断队列是否为空
bool isEmpty(Queue* q)
{
return q->front == q->rear;
}
//判断队列是否为满
bool isFull(Queue* q)
{
return (q->rear + 1) % MAX_SIZE == q->front;
}
//入队
int enqueue(Queue* q, int data)
{
if(isFull(q))
{
printf("Queue is full\n");
return -1;
}
q->data[q->rear] = data;
q->rear = (q->rear + 1) % MAX_SIZE;
return 0;
}
//出队
int dequeue(Queue* q)
{
int temp;
if(isEmpty(q))
{
printf("Queue is empty!\n");
return -1;
}
temp = q->data[q->front];
q->front = (q->front + 1) % MAX_SIZE;
return temp;
}
//获取队首元素
int peekFront(Queue* q)
{
if(isEmpty(q))
{
printf("Queue is Empty!\n");
return -1;
}
return q->data[q->front];
}
//计算队列当前元素数量
int lengthQueue(Queue* q)
{
if(q->rear >= q->front)
{
return q->rear - q->front;
}
else
{
return q->rear - q->front + MAX_SIZE;
}
}
//释放队列内存
void freeQueue(Queue* q)
{
while(!isEmpty(q))
{
int val;
dequeue(q);
}
}
int main()
{
int n = 0;//操作总数
int order = 0;//操作指令
int num = 0;//要入队输入的数据
Queue q;
initQueue(&q);
scanf("%d",&n);
while(n--)
{
scanf("%d",&order);
if(order == 1)
{
scanf("%d",&num);
enqueue(&q, num);
}
else if(order == 2)
{
if(isEmpty(&q))
{
printf("ERR_CANNOT_POP\n");
}
else
{
dequeue(&q);
}
}
else if(order == 3)
{
if(isEmpty(&q))
{
printf("ERR_CANNOT_QUERY\n");
}
else
{
printf("%d\n",peekFront(&q));
}
}
else if(order == 4)
{
printf("%d\n",lengthQueue(&q));
}
}
return 0;
}