#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
#define MAXN 1003
//循环队列:
/*
当进行动态创建队列的时候,
也只不过是向后继续不断的申请内存空间,
即时前面出队操作释放掉了前面的空间,但是指针依旧会向后进行移动,
直到达到系统预留给程序的内存上界被强行终止,这对于极为频繁的队列
操作和程序而言是致命的,这时候,就需要对我们的队列进行优化,
使用更为优秀的结构——循环队列。
*/
typedef struct cqueue
{
int data[MAXN];
int front;
int rear;
}cqueue;
//循环队列的初始化
cqueue *init_queue()
{
cqueue *q=(cqueue*)malloc(sizeof(cqueue));
if(q==NULL)
{
cout<<"循环队列创建失败!"<<endl;
exit(0);
}
memset(q->data,0,sizeof(q->data));
q->front=0;
q->rear=0;
return q;
}
//循环队列的入队操作
void push_queue(cqueue *q,int data)
{
//%MAXN保证只会再MAXN这个范围内进行操作
if((q->rear+1)%MAXN==q->front)
{
cout<<"队列已满,无法入队"<<endl;
return;
}
else
{
q->rear=(q->rear+1)%MAXN;
q->data[q->rear]=data;
}
}
//出队操作
void pop_queue(cqueue *q)
{
if(q->front==q->rear)
{
cout<<"当前队列为空,无法出队!"<<endl;
return;
}
else
{
q->data[q->front]=0;
q->front=(q->front+1)%MAXN;
}
}
//打印队列
void display_queue(cqueue *q)
{
int i=q->front;
int pos=1;
while(i!=q->rear)
{
i=(i+1)%MAXN;
cout<<"第"<<pos++<<"个元素的值为:"<<q->data[i]<<endl;
}
}
int main()
{
//初始化栈
cout<<"*******************************"<<endl;
cqueue *q=init_queue();
cout<<"入队操作:"<<endl;
push_queue(q,10);
push_queue(q,20);
push_queue(q,30);
push_queue(q,40);
display_queue(q);
cout<<"*******************************"<<endl;
cout<<"出队操作(2次):"<<endl;
pop_queue(q);
pop_queue(q);
display_queue(q);
cout<<"*******************************"<<endl;
cout<<"所有操作执行完毕!"<<endl;
cout<<"*******************************"<<endl;
return 0;
}