
牺牲一个存储单元来判断队满。
#include<iostream>
using namespace std;
// 循环队列
#define MaxSize 10
typedef int ElemType;
typedef struct {
ElemType data[MaxSize];
int front, rear;
} SqQueue;
// 初始化队列
void InitQueue(SqQueue &Q) {
// 判断队空 Q.rear == Q.front
Q.front = Q.rear = 0;
}
// 入队
bool EnQueue(SqQueue &Q, ElemType x) {
// 队尾指针的后一个位置为队头指针 即队满
if((Q.rear + 1 % MaxSize == Q.front)) {
return false;
}
// 队尾指针指向队尾元素的后一个位置
Q.data[Q.rear] = x;
// 队尾指针后移
Q.rear = (Q.rear + 1) % MaxSize;
return true;
}
// 出队
bool DeQueue(SqQueue &Q, ElemType &x) {
if (Q.front == Q.rear) {
return false;
}
x = Q.data[Q.front];
Q.front = (Q.front + 1) % MaxSize;
return true;
}
// 遍历
void Traverse(SqQueue Q) {
for (int i = Q.front; i < Q.rear; i++) {
cout << Q.data[i] << " ";
}
cout << endl;
}
// 长度
int QueueLength(SqQueue Q) {
return (Q.rear - Q.front + MaxSize) % MaxSize;
}
int main() {
SqQueue Q;
InitQueue(Q);
ElemType x;
EnQueue(Q, 1);
EnQueue(Q, 2);
EnQueue(Q, 3);
EnQueue(Q, 4);
DeQueue(Q, x);
cout << "出队元素为:" << x << endl;
cout << "队列长度为:" << QueueLength(Q) << endl;
Traverse(Q);
return 0;
}

特殊地,如果队尾指针指向的是队尾元素:
// 判断空
// 队尾指针的后一个位置就是队头指针
(Q.rear + 1) % MaxSize == Q.front
// 判断满
// 队尾指针的后两个位置就是队头指针,后一个位置为空
当然,还可以加一个变量比如 size 或者 tag 来进行判断。
此外,期末考试版(O.o):
#include <iostream>
using namespace std;
#define MaxSize 10
// 循环队列
typedef struct
{
int data[MaxSize];
int front;
int back;
} CQueue;
// 初始化循环队列
void InitQueue(CQueue &Q)
{
Q.front = Q.back = 0;
}
// 求循环队列元素个数
int GetSize(CQueue &Q)
{
int size = (Q.back - Q.front + MaxSize) % MaxSize;
return size;
}
// 入队
bool EnQueue(CQueue &Q, int x)
{
// back 的后一位如果是 front 的话则队满
// 如果 back 和 front 处于同一位的话则队空
int newBack = (Q.back + 1) % MaxSize;
if (newBack == Q.front)
{
return false;
}
Q.data[Q.back] = x;
Q.back = newBack;
return true;
}
// 出队
bool DeQueue(CQueue &Q, int &x)
{
if (Q.front == Q.back)
{
return false;
}
x = Q.data[Q.front];
Q.front = (Q.front + 1) % MaxSize;
return true;
}
int main()
{
CQueue Q;
Q.front = Q.back = 0;
int x;
EnQueue(Q, 1);
EnQueue(Q, 2);
cout << GetSize(Q) << endl;
DeQueue(Q, x);
cout << x << endl;
return 0;
}



2万+

被折叠的 条评论
为什么被折叠?



