队列的顺序实现
循环队列常见的定义方法:
①rear 指向队尾元素后一个位置 ②rear 指向队尾元素
a.牺牲一个存储单元 b.增加size变量记录队列长度 c.增加tag标记操作
①②的区别主要在于初始化和出入队时指针指向不同
abc的区别主要在于判断为空或已满的方式不同
一、rear指向队尾元素的后一个元素,牺牲一个存储单元
1.定义
#define MaxSize 50
typedef struct{
int data[MaxSize];
int front,rear;
}SqQueue;
2.初始化
void initQueue(SqQueue &Q){
Q.front = Q.rear = 0;
return;
}
3.入队
bool enQueue(SqQueue &Q, e){
if(Q.rear == Q.front){
return false;
}
Q.data[Q.rear] = e;
Q.rear = (Q.rear + 1) % MaxSize;
return true;
}
4.出队
bool deQueue(SqQueue &Q, &e){
if((Q.rear + 1) % MaxSize == Q.front){
return false;
}
e = Q.data[Q.front];
Q.front = (Q.front + 1) % MaxSize;
return true;
}
5.判空
bool queueEmpty(SqQueue Q){
if(Q.rear == Q.front){
return true;
}else{
return false;
}
}
6.判满
Q.rear - Q.front == MaxSize
bool queueFull(SqQueue Q){
if((Q.rear + 1) % MaxSize == Q.front){
return true;
}else{
return false;
}
}
7.队列长度的计算(队列中元素的个数)
length = (Q.rear + MaxSize -Q.front) % MaxSize
二、rear指向队尾元素的后一个元素,增加size变量记录队列长度
1.定义
#define MaxSize 50
typedef struct{
int data[MaxSize];
int front,rear;
int size;
}SqQueue;
2.初始化
void initQueue(SqQueue &Q){
Q.front = Q.rear = 0;
Q.size = 0;
return;
}
3.入队
bool enQueue(SqQueue &Q, int e){
if(Q.size == MaxSize){
return false;
}
Q.data[Q.rear] = e;
Q.rear++;
Q.size++;
return true;
}
4.出队
bool deQueue(SqQueue &Q, int&e){
if(Q.size == 0){
return false;
}
e = Q.data[Q.front];
Q.front++;
Q.size--;
return true;
}
5.判空
bool queueEmpty(SqQueue, Q){
if(Q.size == 0){
return true;
}else{
return false;
}
}
6.判满
bool queueFull(SqQueue Q){
if(Q.size == MaxSize){
return true;
}else{
return false;
}
}
7.队列长度的计算(队列中元素的个数)
length = Q.size;
三、rear指向队尾元素的后一个元素,增加tag=0/1用于标记最近的一次操作时出队/入队
1.定义
#define MaxSize 50
typedef struct{
int data[MaxSize];
int front,rear;
int tag;
}SqQueue;
2.初始化
void initQueue(SqQueue &Q){
Q.rear = Q.front = 0;
Q.tag=1;
return;
}
3.入队
bool enQueue(SqQueue &Q, int e){
if(Q.rear == Q.front && Q.tag == 0){
return false;
}
Q.data[Q.rear] = e;
Q.rear++;
Q.tag = 0;
return true;
}
4.出队
bool deQueue(SqQueue &Q, int &e){
if(Q.rear == Q.front && Q.tag == 1){
return false;
}
e = Q.data[Q.front];
Q.front++;
Q.tag = 1;
return true;
}
5.判空
bool queueEmpty(SqQueue Q){
if(Q.rear == Q.front && Q.tag == 1){
return true;
}else{
return false;
}
}
6.判满
bool queueFull(SqQueue Q){
if(Q.rear == Q.front && Q.tag == 0){
return true;
}else{
return false;
}
}
7.队列长度的计算
length = (Q.rear + MaxSize -Q.front) % MaxSize
四、rear指向队尾元素,牺牲一个存储单元
1.定义
#define MaxSize 50
typedef struct{
int data[MaxSize];
int front,rear;
}SqQueue;
2.初始化
void initQueue(SqQueue &Q){
Q.front=0;
Q.rear=MaxSize-1;
return;
}
3.入队
bool enQueue(SqQueue &Q, int e){
if((Q.rear + 2) % MaxSize == Q.front){
return false;
}
Q.rear = (Q.rear + 1)%MaxSize;
Q.data[Q.rear] = e;
return true;
}
4.出队
bool deQueue(SqQueue &Q, int &e){
if((Q.rear + 1) % MaxSize == Q.front){
return false;
}
e = Q.data[Q.front];
Q.front++;
return true;
}
5.判空
bool queueEmpty(SqQueue Q){
if((Q.rear + 1) % MaxSize == Q.front){
return true;
}else{
return false;
}
}
6.判满
Q.rear - Q.front + 1 == MaxSize
bool queueFull(SqQueue Q){
if((Q.rear + 2) % MaxSize == Q.front){
return true;
}else{
return false;
}
}
7.队列长度的计算
length = (Q.rear + MaxSize - Q.front + 1) % MaxSize
五、rear指向队尾元素,增加size变量记录队列长度
1.定义
#define MaxSize 50
typedef struct{
int data[MaxSize];
int front,rear;
int size;
}SqQueue;
2.初始化
void initQueue(SqQueue &Q){
Q.front=0;
Q.rear=MaxSize-1;
Q.size = 0;
return;
}
3.入队
bool enQueue(SqQueue &Q, int e){
if(Q.size == MaxSize){
return false;
}
rear = rear + 1;
Q.data[Q.rear] = e;
Q.size++;
return true;
}
4.出队
bool deQueue(SqQueue &Q, int &e){
if(Q.size == 0){
return false;
}
e = Q.data[Q.front];
front++;
size--;
return true;
}
5.判空
bool queueEmpty(SqQueue Q){
if(Q.size == 0){
return true;
}else{
return false;
}
}
6.判满
bool queueFull(SqQueue Q){
if(Q.size == MaxSize){
return true;
}else{
return false;
}
}
7.队列长度的计算
length = Q.size
六、rear指向队尾元素,增加tag=0/1用于标记最近的一次操作
1.定义
#define MaxSize 50
typedef struct{
int data[MaxSize];
int front,rear;
int tag;
}SqQueue;
2.初始化
void initQueue(){
Q.front=0;
Q.rear=MaxSize-1;
return;
}
3.入队
bool enQueue(SqQueue &Q, int e){
if((Q.rear+1)%MaxSize==Q.front && Q.tag == 0){
return false;
}
Q.rear = Q.rear + 1;
Q.data[Q.rear] = e;
Q.tag = 0;
return true;
}
4.出队
bool deQueue(SqQueue &Q, int &e){
if((Q.rear+1)%MaxSize==Q.front && Q.tag == 1){
return false;
}
e = Q.data[Q.front];
Q.front++;
Q.tag = 1;
return true;
}
5.判空
bool queueEmpty(SqQueue Q){
if((Q.rear+1)%MaxSize==Q.front && Q.tag == 1){
return true;
}else{
return false;
}
}
6.判满
bool queueFull(SqQueue Q){
if((Q.rear+1)%MaxSize==Q.front && Q.tag == 0){
return true;
}else{
return false;
}
}
7.队列长度的计算
length = (Q.rear + MaxSize - Q.front + 1) % MaxSize