#include "stdio.h"
#define MaxSize 10 //定义队列中元素最大个数
判断队列空 / 满 实现 1
//typedef struct {
// int data[MaxSize]; // 用静态数组存放队列元素
// int front,rear; // 队头指针 和 队尾指针
//}SqQueue;
//
初始化队列
//void InitQueue(SqQueue &Q) {
// Q.front = Q.rear = 0;//队头指针 和队尾指针指向 0
//}
判断队空
//bool QueueEmpty(SqQueue Q) {
// return Q.front == Q.rear;
//}
//bool QueueFull(SqQueue Q) {
// return (Q.rear + 1) % MaxSize == Q.front;
//}
判断队列空 / 满 实现 2:使用 size记录当前队列长度
//typedef struct {
// int data[MaxSize]; // 用静态数组存放队列元素
// int front,rear; // 队头指针 和 队尾指针
// int size;
//}SqQueue;
//
初始化队列
//void InitQueue(SqQueue &Q) {
// Q.front = Q.rear = 0;//队头指针 和队尾指针指向 0
// Q.size = 0;
//}
判断队空
//bool QueueEmpty(SqQueue Q) {
// return Q.size == 0;
//}
//bool QueueFull(SqQueue Q) {
// return Q.size == MaxSize;
//}
//判断队列空 / 满 实现 3:使用 tag 记录最近的操作是插入 1 还是删除 0
typedef struct {
int data[MaxSize]; // 用静态数组存放队列元素
int front,rear; // 队头指针 和 队尾指针
int tag; //最近的操作是插入 1 还是删除 0
}SqQueue;
//初始化队列
void InitQueue(SqQueue &Q) {
Q.front = Q.rear = 0;//队头指针 和队尾指针指向 0
Q.tag = 0;
}
//判断队空
bool QueueEmpty(SqQueue Q) {
return Q.front == Q.rear && Q.tag == 0;
}
bool QueueFull(SqQueue Q) {
return Q.front == Q.rear && Q.tag == 1;
}
//元素入队
bool EnQueue(SqQueue &Q,int e) {
if(QueueFull(Q)) // 判断队满
return false;
Q.data[Q.rear] = e; //新元素插入到队尾
Q.rear = (Q.rear + 1) % MaxSize; // 队尾指针加1取模
Q.tag = 1;
return true;
}
//元素出队
bool DeQueue(SqQueue &Q,int &e) {
if(QueueEmpty(Q)) // 判断队空
return false;
e = Q.data[Q.front];
Q.front = (Q.front + 1) % MaxSize;//队头指针后移
Q.tag = 0;
return true;
}
//获得队头元素
bool GetHead(SqQueue Q,int e) {
if(QueueEmpty(Q))
return false;
e = Q.data[Q.front];
return true;
}
//队列长度 (第一种实现方式)
int Length(SqQueue Q) {
return (Q.rear +MaxSize - Q.front) % MaxSize;
}
int main() {
SqQueue Q;
InitQueue(Q);
for (int i = 1; i <= 10; ++i) {
if(EnQueue(Q,i)) {
printf("元素%d入队成功n",i);
} else{
printf("元素%d入队失败n",i);
}
}
int e = -1;
while (DeQueue(Q,e)) {
printf("元素%d出队成功n",e);
}
return 0;
}