队列的特点是先进先出,队伍的头部只能删除,尾部只能添加;使用循环链表的方式进行队列模拟。这里模拟出队、入队。程序如下:
#include<stdio.h>
#include<malloc.h>
typedef struct Queue
{
int * pbase;//用来保存数组
int front; //描述队列的头
int rear; //描述队列的尾
} QUEUE;
#define LENTH 6 //注意不要分号!!!!
bool init_Queue(QUEUE *);
bool en_Queue(QUEUE * pQ,int val);
bool full_Queue(QUEUE * pQ);
bool empty_Queue(QUEUE * pQ);
bool out_Queue(QUEUE * pQ,int *pVal);
bool traverse_Queue(QUEUE * pQ);
int main()
{
int out_val;
QUEUE Q;
init_Queue(&Q);
en_Queue(&Q,60);
en_Queue(&Q,300);
en_Queue(&Q,700);
en_Queue(&Q,1380);
traverse_Queue(&Q);
out_Queue(&Q,&out_val);
printf("删除的元素是 %d\n",out_val);
traverse_Queue(&Q);
return 0;
}
//初始化队列
bool init_Queue(QUEUE * pQ)
{
pQ->front=0;
pQ->rear=0;
pQ->pbase=(int *)malloc(sizeof(int)*LENTH);
if(pQ->pbase==NULL)
{
printf("初始化失败\n");
return false;
}
else return true;
}
//判断队列是否已经满了
bool full_Queue(QUEUE * pQ)
{
if( pQ->front== (pQ->rear+1)%LENTH )
{
printf("队列满了\n");
return true;
}
else return false;
}
//入队
bool en_Queue(QUEUE * pQ,int val)
{
if(full_Queue(pQ))
return false;
else
{
pQ->pbase[pQ->rear]=val;
pQ->rear=(pQ->rear+1)%LENTH;
}
return true;
}
//判断队列是否为空
bool empty_Queue(QUEUE * pQ)
{
if(pQ->rear==pQ->front)
{
printf("队列为空\n");
return true;
}
else return false;
}
//出队
bool out_Queue(QUEUE * pQ,int *pVal)
{
if(empty_Queue(pQ))
{
printf("无法删除队列中的元素\n");
return false;
}
else
{
*pVal=pQ->pbase[pQ->front];
pQ->front=(pQ->front+1)%LENTH;
printf("\n");
return true;
}
}
//队列的遍历
bool traverse_Queue(QUEUE * pQ)
{
if(empty_Queue(pQ))
{
printf("无法遍历\n");
return false;
}
else
{
int i=pQ->front;
printf("队列中的元素是: ");
while(i!=pQ->rear)
{
printf("%d ",pQ->pbase[i]);
i=(i+1)%LENTH; //这里要注意,不是i=i+1 !!!
}
printf("\n");
return true;
}
}