#include<iostream>
#include<fstream>
#include<stdlib.h>
using namespace std;


//循环队列的链式存储结构
typedef struct LinkNode{
char data;
struct LinkNode *next;
} LinkNode;

typedef struct {
LinkNode *front , *rear;
} LinkQueue;


//循环队列的初始化
void InitQueue(LinkQueue &Q)
{
//Q.front = Q.rear = (LinkNode*)malloc(sizeof(LinkNode)); //建立头节点
Q.front = Q.rear = new LinkNode;
if(!Q.front)
exit(0);
Q.front->next=NULL;
}

//循环队列的判空
bool IsEmpty(LinkQueue &Q)
{
if(Q.front==Q.rear)
return true;
else
return false;
}


//循环队列的入队
void EnQueue(LinkQueue &Q, char e) {
//LinkNode *s = (LinkNode *)malloc(sizeof(LinkNode)); //创建新结点,插入到链尾
LinkNode *s = new LinkNode;
s->data=e;
s->next=NULL;
Q.rear->next=s;
Q.rear=s;
}

//循环队列的出队
char DeQueue(LinkQueue &Q) {
if (IsEmpty(Q)){
cout<<"队列已为空"<<endl;
exit(0);
}

LinkNode *p = Q.front->next; //p指向队头元素
char e=p->data;
Q.front->next = p->next; //修改头指针
if(Q.rear==p)
Q.rear=Q.front; //最后一个元素被删,队尾指针指向头结点
delete p;
return e;
}

//取循环队列的队头元素
char GetHead(LinkQueue &Q)
{
if (Q.front != Q.rear)
{
LinkNode *p = Q.front->next;
return p->data;
}

}

void TraverseQueue(LinkQueue &Q)
{
LinkNode *p = Q.front->next; //从队列首节点开始遍历(非头节点,注意区分)

while (p != NULL) {
cout<<p->data;
p = p->next;
}
}


int main()
{
//freopen("input.txt", "r", stdin);
LinkQueue Q;
int n;char e;

InitQueue(Q);

cout<<"输入队列的长度:"<<endl;
cin>>n;
cout<<"输入队列的元素:"<<endl;
for (int i = 1; i <= n; i++){
cin>>e;
EnQueue(Q, e);
}

cout<<"现在队首元素是:";
cout<<GetHead(Q)<<endl;


cout<<"遍历队列结果为:";
TraverseQueue(Q);


cout<<endl<<"请输入要插入的元素的数值:";
cin>>e;
EnQueue(Q,e);


cout<<endl<<"遍历队列结果为:";
TraverseQueue(Q);


cout<<endl<<"执行删除动作,被删元素是:"<<DeQueue(Q)<<endl;


cout<<"遍历队列结果为:";
TraverseQueue(Q);
cout<<endl;


if (IsEmpty(Q))
cout<<"队列为空"<<endl;
else
cout<<"队列非空"<<endl;


return 0;

}