本篇介绍数据结构-队列
思维导图
队列
-
定义
是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表。
-
属性
- 允许删除的一端称为 队头(Front),允许插入的一端称为 队尾(Rear)
- 当队列中没有元素时称为空队列
- 队列称作先进先出(First In First Out)的线性表,简称为FIFO
-
顺序队列-基本运算
- 置空队列
void InitQueue(CirQueue *Q){ Q->front=Q->rear=0; }
- 判队空
int QueueEmpty(CirQueue *Q){ return Q->rear==Q->front; }
- 判队满
int QueueFull (CirQueue *Q){ return (Q->rear+1) % QueueSize == Q->front; }
- 入队列
void EnQueue(CirQueue *Q , DataType x){ if(QueueFull(Q)){ //出错退出处理 printf("Queue overflow"); }else{ Q->data[Q->rear]=x; Q->rear=(Q->rear+1) % QueueSize; //循环意义下的加1 } }
- 取队头元素
DataType GetFront(CirQueue *Q){ if(QueueEmpty(Q)){ //出错退出处理 printf("Queue empty"); exit(0); }else{ return Q->data[Q->front]; //返回队头元素值 } }
- 出队列
DataType DeQueue(CirQueue *Q){ DataType x; if(QueueEmpty(Q)){ //出错退出处理 printf("Queue empty"); exit(0); }else{ x=Q->data[Q->front]; //保存待删除元素值 Q->front=(Q->front+1) % QueueSize; //头指针加一 return x; //返回删除元素值 } }
-
链队列-基本运算
- 构造空队列
void InitQueue (LinkQueue *Q){ Q->front=(QueueNode *)malloc(sizeof(QueueNode)); Q->rear=Q->front; // 尾指针也指向头结点 Q->rear->next=NULL; }
- 判队空
int QueueEmpty(LinkQueue *Q){ return Q->rear==Q->front; //头尾指针相等队列为空 }
- 入队列
void EnQueue(LinkQueue *Q , DataType x){ QueueNode *p->(QueueNode *)malloc(sizeof(QueueNode)); p->data=x; p->next=NULL; Q->rear->next=p; //*p 链到原队尾结点之后 Q->rear=p; //队尾指针指向新的队尾结点 }
- 取队头元素
DataType GetFront(LinkQueue *Q){ if(QueueEmpty(Q)){ //出错退出处理 printf("Queue underflow"); exit(0); }else{ return Q->front->next->data; //返回原队头元素值 } }
- 出队列
DataType DeQueue(LinkQueue *Q){ QueueNode *p; if(QueueEmpty(Q)){ //出错退出处理 printf("Queue underflow"); exit(0); }else{ p->Q->front; //p指向头结点 Q->front=Q->front->next; //头指针指向原队头结点 free(p);//删除释放原头结点 return Q->front->data; //返回原队头结点的数据值 } }