数据结构学习笔记:队列
前言
本文将了队列的定义,操作,应用和总结等。所举例的为基于数组的循环队列。
ps:为何在进行入队出队的时候不直接让front++和rear++,而是用(front+1)%6和(rear+1)%6?
当用++时,当到了数组最后一个元素的时,再用++即超过了数组范围,而用(front+1)%6和
rear+1)%6能避免这种情况,当加到最后一个再加时,能自动返回到第一个个数组元素。
一、定义
如百科所言,队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,即(先入先出,后入后出)和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
typedef struct Queue { int front ;//指向队列头部的指针 int rear;//指向队列尾部的指针 int* pBase;//指向数组的指针 }QUEUE;
二、操作
1.初始化
初始化队列的数组长度、前后端。
void iniQueue(QUEUE* pQ) { pQ->pBase = (int*)malloc(sizeof(int) * 6); pQ->front = 0; pQ->rear = 0; }
2.判断队列是否已满
bool isFull(QUEUE* pQ) { if ((pQ->rear + 1) % 6 == pQ->front) return true; else { return false; } }
3.入队
bool add(int val,QUEUE * pQ) { if (isFull(pQ)) { return false; } else { pQ->pBase[pQ->rear] = val; pQ->rear=(pQ->rear+1)%6; return true; } }
4.判断队列是否为空
bool emput_queue(QUEUE* pQ) { if (pQ->front == pQ->rear) { return true; } else { return false; } }
5.出队
bool out_queue(QUEUE *pQ,int* val) { if (emput_queue(pQ)) { return false; } else { *val = pQ->pBase[pQ->front]; pQ->front = (pQ->front + 1) % 6; return true; } }
6.遍历队列
void traverse_queue(QUEUE* pQ) { int i = pQ->front; while (i!=pQ->rear) { printf("%d ",pQ->pBase[i]); i = (i + 1) % 6; } }