一、队列判空和满的三种情况:
1.牺牲一个队列单元来区分空和满;
2.设置变量size来判队列的空和满;
3.类型中增加tag数据成员,来区分空和满;
1.牺牲一个队列单元来区分空和满
(1)rear指向队尾元素的下一个元素
#include<stdio.h>
#define MaxSize 50
typedef int ElemType;
typedef struct {
ElemType data[MaxSize];
int front, rear;
}SqQueue;
//队头元素指向队头,队尾元素指向队尾下一个元素
//初始化队列
void InitQueue(SqQueue& Q) {
Q.front = 0;
Q.rear = 0;
}
//判空
bool isEmpty(SqQueue Q) {
if (Q.rear == Q.front)
return true;
else
return false;
}
//入队
bool InsertQueue(SqQueue& Q, ElemType e) {
if ((Q.rear+1)% MaxSize == Q.front) //区别队满和空,牺牲一个存储单元
return false;
Q.data[Q.rear] = e;
Q.rear = (Q.rear + 1) % MaxSize;
return true;
}
//出队
bool DeQueue(SqQueue& Q, ElemType& x) {
if (Q.rear == Q.front)
return false;
x = Q.front;
Q.front = (Q.front + 1) % MaxSize;
return true;
}
void printfQueue(SqQueue Q) {
printf("队列为:\n");
for (int i = Q.front; i <Q.rear; i++) {
printf("%d\n", Q.data[i]);
}
}int main() {
SqQueue q;
InitQueue(q);
printf("是否为空:%d\n", isEmpty(q));
InsertQueue(q, 1);
InsertQueue(q, 2);
InsertQueue(q, 3);
InsertQueue(q, 4);
printfQueue(q);
printf("是否为空:%d\n", isEmpty(q));
int a = 0;
DeQueue(q, a);
printfQueue(q);
return 0;
}
(2).rear指向队尾元素
#include<stdio.h>
#define MaxSize 50
typedef int ElemType;
typedef struct {
ElemType data[MaxSize];
int front, rear;
}SqQueue;
//队头元素指向队头,队尾元素指向队尾
//初始化队列
void InitQueue(SqQueue& Q) {
Q.front = 0;
Q.rear = MaxSize-1; //队尾指针指向front指针前一位
}
//判空
bool isEmpty(SqQueue Q) {
if ((Q.rear + 1) % MaxSize == Q.front)//rear在front后方且相邻为空。
return true;
else
return false;
}
//入队
bool InsertQueue(SqQueue& Q, ElemType e) {
if ((Q.rear+2)% MaxSize == Q.front) //区别队满和空,牺牲一个存储单元:当rear在front后方且间距一个单位长度时为满
return false;
Q.rear = (Q.rear + 1) % MaxSize;
Q.data[Q.rear] = e;
return true;
}
//出队
bool DeQueue(SqQueue& Q, ElemType& x) {
if ((Q.rear + 1) % MaxSize == Q.front)
return false;
x = Q.front;
Q.front = (Q.front + 1) % MaxSize;
return true;
}
void printfQueue(SqQueue Q) {
printf("队列为:\n");
for (int i = Q.front; i <=Q.rear; i++) {
printf("%d\n", Q.data[i]);
}
}int main() {
SqQueue q;
InitQueue(q);
printf("是否为空:%d\n", isEmpty(q));
InsertQueue(q, 1);
InsertQueue(q, 2);
InsertQueue(q, 3);
InsertQueue(q, 4);
printfQueue(q);
printf("是否为空:%d\n", isEmpty(q));
int a = 0;
DeQueue(q, a);
printfQueue(q);
return 0;
}
2.设置变量size来判队列的空和满
#include<stdio.h>
#define MaxSize 50
typedef int ElemType;
typedef struct {
ElemType data[MaxSize];
int front, rear;
int size;//表示当前队列的长度
}SqQueue;
void InitQueue(SqQueue& Q) {
Q.front = 0;
Q.rear =0; //队尾指针指队尾元素
Q.size = 0;//令size=0表示队空
}
//判空
bool isEmpty(SqQueue Q) {
if (Q.size==0)
return true;
else
return false;
}
//入队
bool InsertQueue(SqQueue& Q, ElemType e) {
if (Q.size==MaxSize-1) //判读队列是否为满
return false;
Q.data[Q.rear] = e;
Q.rear = (Q.rear + 1) % MaxSize;
Q.size++;
return true;
}
//出队
bool DeQueue(SqQueue& Q, ElemType& x) {
if (Q.size == 0)
return false;
x = Q.front;
Q.front = (Q.front + 1) % MaxSize;
Q.size--;
return true;
}
void printfQueue(SqQueue Q) {
printf("队列为:\n");
for (int i = Q.front; i <Q.rear; i++) {
printf("%d\n", Q.data[i]);
}
}
int main() {
SqQueue q;
InitQueue(q);
printf("是否为空:%d\n", isEmpty(q));
InsertQueue(q, 1);
InsertQueue(q, 2);
InsertQueue(q, 3);
InsertQueue(q, 4);
printfQueue(q);
printf("是否为空:%d\n", isEmpty(q));
int a = 0;
DeQueue(q, a);
DeQueue(q, a);
DeQueue(q, a);
DeQueue(q, a);
printfQueue(q);
printf("是否为空:%d\n", isEmpty(q));
return 0;
}
3.与第二种差别不大