一般的数组进行出队和入队,front和rear只能增加不能减,会让内存浪费,所以要搞一个循环队列,当到达最后一个时候,我们让它的下标又为0,循环下去。
#include<stdio.h>
#include<malloc.h>
typedef struct Queue
{
int *arr;
int front;//队头
int rear;//最后一个有效元素下一个
}QUEUE;
void init(QUEUE *pq)
{
pq->arr=(int*)malloc (sizeof(int)*5);
pq->front=pq->rear=0;
}
bool isfull(QUEUE *pq)
{
if((pq->rear+1)%5==pq->front)//如果有n个元素,我们只存放n-1个元素如果rear和front相挨,并且rear+1对数组长度取余等于front说明满了,
{
return true;
}
else{
return false;
}
}
bool enqueue(QUEUE*pq,int val)
{
if(isfull(pq))
{
return false;
}
else
{
pq->arr[pq->rear]=val;//把值赋给数组下标为rear
pq->rear=(pq->rear+1)%5;//rear加一,因为是循环队列,所以采用rear+1对数组长度取余来计算
return true;
}
}
bool isempty(QUEUE*pq)
{
if(pq->front==pq->rear)//front==rear说明为空
{
return true;
}
else{
return false;
}
}
bool dequeue(QUEUE*pq,int *val)
{
if(isempty(pq))
{
return false;
}else
{
*val=pq->arr[pq->front];//把要出队的元素用临时变量保存起来
pq->front=(pq->front+1)%5;//front加一对数组长度取余
return true;
}
}
void print(QUEUE*pq)
{
while(pq->front!=pq->rear)//队头不等于最后一个有效元素下一个
{
printf("%d\n",pq->arr[pq->front]);//打印值
pq->front=(pq->front+1)%5;//front加一对数组长度取余
}
}
int main(void)
{
int val;
QUEUE q;
init(&q);
enqueue(&q,1);
enqueue(&q,2);
enqueue(&q,3);
enqueue(&q,8);
if(dequeue(&q,&val))
{
printf("出队成功元素是%d\n",val);
}
else
{
printf("出队失败");
}
print(&q);
return 0;
}
效果: