1.方法一
此方法采用损失一个元素空间的方法,来判断队列是否满,当队尾指针指向空单元的后继单元是队头指针指向的空间时,则停止入队,即
(rear+1)%MAXSIZE=front
时队满
- 图示如下
- 以下为相关标志和动作
#判断队空
Q->front==Q->rear
#判断队满
(Q->rear+1) mod MAXSIZE==Q->front
#进队操作,尾指针变化
Q->rear=(Q->rear+1) mod MAXSIZE
#出队操作,头指针变化
Q->front=(Q->front+1) mod MAXSIZE
- 以下为有关算法
1.1结构体定义
define MAXSIZE 50
typedef struct{
int data[MAXSIZE];
int front;
int rear;
}
1.2初始化
void InitQueue(seqQueue *Q){
Q->front==Q->rear==0;
}
1.3入队
int EneterQueue(seqQueue *Q, int x){
if((Q->rear+1)%MAXSIZE==Q->front)
return -1; # 队满
Q->data[Q->rear]=x;
Q->rear=(Q->rear+1)%MAXSIZE; # 重新设置队尾指针
return 1; # 入队成功
}
1.4出队
int DeleteQueue(seqQueue *Q, int *x){
if(Q->rear==Q->front)
return -1; # 队空
x=Q->data[Q->front];
Q->front=(Q->front+1)%MAXSIZE;
return 1; # 出队成功
}
2.方法二
此方法是增设一个标志量
tag
,以区别队列是空还是满,这种方法不损失空间
2.1结构体定义
define MAXSIZE 50
typedef struct{
int data[MAXSIZE];
int front;
int rear;
int tag;
}
2.2初始化
void InitQueue(seqQueue *Q){
Q->front==Q->rear==0;
tag=0;
}
2.3入队
int EneterQueue(seqQueue *Q, int x){
if(Q->rear==Q->front&&Q->tag==1)
return -1; # 队满
Q->data[Q->rear]=x;
Q->rear=(Q->rear+1)%MAXSIZE; # 重新设置队尾指针
if(Q->rear==Q->front)
Q->tag=1;
return 1; # 入队成功
}
2.4出队
int DeleteQueue(seqQueue *Q, int *x){
if(Q->rear==Q->front&&Q->tag==0)
return -1; # 队空
x=Q->data[Q->front];
Q->front=(Q->front+1)%MAXSIZE;
if(Q->rear==Q->front)
Q->tag=0;
return 1; # 出队成功
}