数组实现
基本思想
用线性表实现队列如图所示:
队尾指向最后一个数据元素的后一个位置,所以front==rear代表队列为空
在队尾插入元素,在队头取元素,一般我们用这个结构实现循环队列,取元素时front=(front+1)%Size,插入元素使用rear=(rear+1)%Size,由于是循环队列,所以队列满的条件也变为了rear==ront
为了解决这个问题,我们将队列中闲置一个元素,将rear指向的空间始终置空,所以队列满的条件变为了(rear+1)%Size==front,如图
循环队列计算队列长度的公式为:(rear+Size-front)%Size
代码实现
-
队列的定义
#define QueueSize 100 #define Elemtype int typedef struct queue{ Elemtype *base;//动态分配数组返回的指针 int front;//队头下标 int rear;//队尾下标 int QueueLength;//队列实际长度 }Queue;
-
队列的初始化
Status InitQueue(Queue *Q){ Q->base=(Elemtype *)malloc(QueueSize*sizeof(Elemtype)); if(!Q->base) return ERROR; Q->front=Q->rear=0; return OK; }
-
计算队列长度
int QueueLength(Queue *Q){ return((Q->rear-Q->front+QueueSize)%QueueSize); }
-
入队列
Status InQueue(Queue *Q,Elemtype e){ if((Q->rear+1)%QueueSize==Q->front)//队列已满 return ERROR; Q->base[Q->rear]=e; Q->rear=(Q->rear+1)%QueueSize; }
-
出队列
Status OutQueue(Queue *Q,Elemtype *e){ if(Q->rear==Q->front)//队列为空 return ERROR; *e=Q->base[Q->front]; Q->front=(Q->front+1)%QueueSize; }
链表实现
使用链表实现队列的思想比较简单,需要保存指向头节点和尾节点的两个指针
代码实现
-
声明
typedef struct QueueNode{//单节点 Elemtype data; struct QueueNode *next; }QueueNode; typedef struct Queue{ QueueNode *front;//链表的头节点,头节点不存放元素 QueueNode *rear; }
-
初始化
Status InitQueue(Queue *Q){ Q->head=(QueueNode *)malloc(sizeof(QueueNode)); if(!Q->front) return ERROR; Q->front->next=NULL; Q->rear=Q->front; }
-
入队列
Status InQueue(Queue *Q,Elemtype e){ QueueNode *tmp=(QueueNode *)malloc(sizeof(QueueNode)); if(!tmp) return ERROR; tmp->data=e; tmp->next=NULL; Q->rear->next=tmp; Q->rear=tmp; }
-
出队列
Status OutQueue(Queue *Q,Elemtype *e){ if(Q->front==Q->rear)//队列为空 return ERROR; QueueNode *tmp=Q->front->next; *e=tmp->data; if(tmp==Q->rear)//这里需要考虑到队列中只有一个元素的情况 Q->rear=Q->front; free(tmp); return OK; }
-
销毁队列
Status DestroyQueue(Queue *Q){ while(Q->front->next){ QueueNode *p=Q->front; Q->front=Q->front->next; free(p); } return OK; }