队列是一种先进先出(FIFO)的结构,他只允许在表的一头进行插入(队头),在另一头删除元素(队尾)。而队列又分为线形队列和环形队列,下面首先介绍线性队列的C语言实现。
现行队列的基本架构:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h> //使用bool必须包含此文件
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
#define QUEUE_CAPACITY 3 //队列容量
typedef struct tag_queue
{
int *pQueue; //队列内存指针
int head;
int tail;
int length;
}LineQueue;
bool InitQueue(LineQueue **myQueue);
void DestroyQueue(LineQueue *myQueue);
void ClearQueue(LineQueue *myQueue); //清空队列
bool QueueEmpty(LineQueue *myQueue);
bool QueueFull(LineQueue *myQueue);
int QueueLength(LineQueue *myQueue);
bool EnQueue(LineQueue *myQueue,int elem);//入队
bool DeQueue(LineQueue *myQueue,int *elem);//出队
void QueueTraverse(LineQueue *myQueue,int flag); //遍历,第二个参数为遍历方式
bool InitQueue(LineQueue **myQueue)//想想为什么要用二级指针?
{
*myQueue=(LineQueue*)malloc(sizeof(LineQueue));
if(*myQueue==NULL)
{
return false;
}
(*myQueue)->pQueue=(int *)malloc(sizeof(int)*QUEUE_CAPACITY);
if((*myQueue)->pQueue==NULL)
{
return false;
}
(*myQueue)->head=0;
(*myQueue)->tail=0;
(*myQueue)->length=0;
return true;
}
void DestroyQueue(LineQueue *myQueue)
{
free(myQueue->pQueue);
myQueue->pQueue=NULL;
free(myQueue);
myQueue=NULL;
}
void ClearQueue(LineQueue *myQueue)
{
myQueue->length=0;
myQueue->tail=0;
}
bool QueueEmpty(LineQueue *myQueue)
{
if(myQueue->length==0)
{
return true;
}
return false;
}
bool QueueFull(LineQueue *myQueue)
{
if(myQueue->length==QUEUE_CAPACITY)
{
return true;
}
return false;
}
int QueueLength(LineQueue *myQueue)
{
return myQueue->length;
}
bool EnQueue(LineQueue *myQueue,int elem)
{
if(QueueFull(myQueue))
{
return false;
}
myQueue->pQueue[myQueue->tail]=elem;
myQueue->tail++;
myQueue->length++;
return true;
}
bool DeQueue(LineQueue *myQueue,int *elem)
{
int i;
if(QueueEmpty(myQueue))
{
return false;
}
*elem=myQueue->pQueue[myQueue->head];//第一个元素
for(i=0;i<myQueue->length-1;i++)
{
myQueue->pQueue[i-1]=myQueue->pQueue[i];//后一个元素前移
}
myQueue->length--;
myQueue->tail--;
return true;
}
void QueueTraverse(LineQueue *myQueue,int flag)
{
int i;
if(flag==0) //从头到尾
{
for(i=0;i<myQueue->length-1;i++)
{
printf("%d\n",myQueue->pQueue[i]);
}
}
if(flag==1)//从尾到头
{
for(i=myQueue->length-1;i>=0;i--)
{
printf("%d\n",myQueue->pQueue[i]);
}
}
}
int main(int argc, char *argv[])
{
LineQueue *queue=NULL;
InitQueue(&queue);
if(QueueEmpty(queue))
{
printf("\n队列为空");
}
printf("\n%p",queue);
EnQueue(queue,1);
EnQueue(queue,2);
EnQueue(queue,3);
if(QueueFull(queue))
{
printf("\n队列为满\n");
}
printf("QueueLength= %d\n",queue->length);
QueueTraverse(queue,1); //从尾到头遍历
int elem=0;
DeQueue(queue,&elem); //出队
printf("\nelem= %d\n",elem);
DeQueue(queue,&elem); //出队
printf("\nelem= %d\n",elem);
DeQueue(queue,&elem); //出队
printf("\nelem= %d\n",elem);
if(QueueEmpty(queue))
{
printf("\n队列为空");
}
DestroyQueue(queue);
return 0;
}
运行结果如下: