/*
循环队列
*/
#include <iostream>
#define MaxSize 10 // 队列中元素的最大个数
using namespace std;
typedef int ElemType;
struct SqQueue {
ElemType data[MaxSize]; // 队列中元素的最多个数
int front, rear; // 队头指针,队尾指针
};
// 初始化队列
void InitQueue(SqQueue &Q) { Q.front = Q.rear = 0; }
// 队列判空
bool QueueEmpty(SqQueue &Q) {
if (Q.front == Q.rear) {
return true;
} else {
return false;
}
}
// 入队
bool EnQueue(SqQueue &Q, ElemType x) {
if ((Q.rear + 1) % MaxSize == Q.front) { // 队满
return false;
} else {
Q.data[Q.rear] = x; // 赋值给下一队尾
Q.rear = (Q.rear + 1) %
MaxSize; // 在逻辑上将存储空间变为“环状”,物理上仍然是静态数组
return true;
}
}
// 出队
bool DeQueue(SqQueue &Q, ElemType &x) {
if (Q.rear == Q.front) { // 队空
return false;
} else {
x = Q.data[Q.front];
Q.front = (Q.front + 1) % MaxSize; // 队头指针后移
return true;
}
}
// 获取队头元素
bool GetHead(SqQueue &Q, ElemType &x) {
if (Q.rear == Q.front) { // 队空
return false;
} else {
x = Q.data[Q.front];
return true;
}
}
// 获取队列长度
bool GetLength(SqQueue &Q, ElemType &len) {
if (Q.front == Q.rear) {
len = 0;
} else {
len = Q.front; // 指向队头
while ((len + 1) % MaxSize != Q.rear) {
len++;
}
len = len - Q.front + 1; // 如果有元素出队,会导致Q.front不为0,影响长度的判断,且初始化队列时,Q.front置为0,同样影响长度
}
return true;
}
int main() {
SqQueue Q;
InitQueue(Q);
ElemType head, pop, length;
for (int i = 1; i < 6; i++) {
EnQueue(Q, i);
}
GetHead(Q, head);
cout << "队头元素:" << head << endl;
GetLength(Q, length);
cout << "队列长度:" << length << endl;
DeQueue(Q, pop);
cout << "出队元素:" << pop << endl;
GetHead(Q, head);
cout << "队头元素:" << head << endl;
GetLength(Q, length);
cout << "队列长度:" << length << endl;
}