队列(queue)是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
队列的实现
队列的实现,和我们上节介绍的栈一样,都可以由数组和链表实现,这里我们使用连链表来实现队列,下面为队列定义的结构体:
typedefintElemtype;typedefstructLNode{ structLNode*next; Elemtypedata;}LNode;typedefstructqueue{ LNode*front; LNode*rear; intlen;}queue;
这里可以给栈定义一系列基本操作:
queue*InitQueue()//初始化一个队列voidEnQueue(queue*q,Elemtypedata)//入队ElemtypeDeQueue(queue*q)//出队
初始化一个队列
queue*InitQueue(){ queue*q=calloc(1,sizeof(queue)); assert(q); returnq;}
入队、出队操作很简单,我们只要操作队列结构体中的front以及rear俩个指针就可以实现入队以及出队
入队
这里我们只要将新结点赋值给rear的next即可,上代码
voidEnQueue(queue*q,Elemtypedata){ assert(q); if(q-front==NULL) { LNode*node=calloc(1,sizeof(LNode)); node-data=data; assert(node); q-front=node; q-rear=node; q-len++; } else{ LNode*node=calloc(1,sizeof(LNode)); node-data=data; assert(node); q-rear-next=node; q-len++; q-rear=node; }}
出队
这里我们要判断队列是否为空,如果不为空,则可以放回空值,如果不为空,即可返回值,上代码
ElemtypeDeQueue(queue*q){ assert(q); if(q-len!=0) { LNode*node=q-front; Elemtypedata=node-data; q-len--; q-front=node-next; if(q-len==0) { q-rear==NULL; } free(node); returndata; } else{ return-1; }}