队列
// 初始化队列
void initialQueue(Queue &Q) {
// plist指向一个用于存储节点地址的顺序表
Q.pList = (ElemType *)malloc(sizeof(ElemType) * MAX_SIZE);
//这个特殊的顺序麦只能在rear存入数据,且rear永远指向下一个存储数据的空白单元
//front指向已经存储进去的元素 且front永远指向未来第一个要出队列的数据所在单元
//队刻为空时front指向rear(空白数据单元)
// 队列为空,所以将front和rear都设置为0
Q.front = 0;
Q.rear = 0;
}
在队尾插入数据
void enqueue(Queue &Q, ElemType element) {
// 进队列首先应该判断是否满。插入的位置是在rear位置的下一个。
// 一旦入队列后,rear会将数据移到下一个位置pos,。如果pos是front则front=rear;
// 如果rear等于front,则队列满了,因为之前规定front = rear为队空,但实际上队列是满的,为了解决这个矛盾。
// 将 (rear + 1) % MAX_SIZE == front 视为队列满,即不能再插入数据,避免溢出,牺牲掉一个空白单元。
int nextInsertPos = (Q.rear + 1) % MAX_SIZE;
//在rear当前指向的存储单元写入数据
Q.pList[Q.rear] = element;
Q.rear = (Q.rear + 1) % MAX_SIZE;
}
// 从队头出队数据
ElemType dequeue(Queue &Q) {
// 获取队头元素,然后将front向后移动一位
ElemType element = Q.pList[Q.front];
Q.front = (Q.front + 1) % MAX_SIZE;
return element;
}
// 检查队列是否为空,返回1表示空,返回0表示非空
int isEmpty(Queue &Q) {
if (Q.front == Q.rear) {
return 1; // 队列为空
} else {
return 0; // 队列非空
}
}
// 检查队列是否已满,返回1表示满,返回0表示未满
int isFull(Queue &Q) {
if ((Q.rear + 1) % MAX_SIZE == Q.front) {
return 1; // 队列已满
} else {
return 0; // 队列未满
}
}