顺序循环队列队满队空的两种判别方式

写在前面:博主是一位普普通通的19届二本大学生,平时最大的爱好就是听听歌,逛逛B站。博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事,做自己以后不会留有遗憾的事,做自己觉得有意义的事,不浪费这大好的青春年华。博主写博客目的是记录所学到的知识并方便自己复习,在记录知识的同时获得部分浏览量,得到更多人的认可,满足小小的成就感,同时在写博客的途中结交更多志同道合的朋友,让自己在技术的路上并不孤单。

目录:
1.方法一:少用一个元素空间
2.方法二:设置标志位区分队列的空和满

1.方法一:少用一个元素空间

我们严蔚敏奶奶的书是使用的这种方法

当我们的顺序循环队列空间大小是m那么有m-1个元素就可以认为是队满,也就是:
(Q.rear+1)%MAXQSIZE==Q.front
那么队空就是首尾指针相等,即:
Q.front==Q.rear

2.方法二:设置标志位区分队列的空和满

我们看一道程序设计题:

假设以数组Q[m]存放循环队列元素,同时设置一个标志tag以tag== 0和tag==1来区别在队头指针(Q.front)和队尾指针(Q.rear)相等时,队列状态为空,还是满,并试着写出相应插入删除的算法

直接看代码:

typedef struct{
	ElemType *base;
	int front;
	int rear;
	int tag;
}SqQueue;
Status InitQueue(SqQueue &Q)
{
	Q.base=new ElemType[MAXSIZE];
	if(!Q.base)
	exit(1);
	Q.front=Q.rear=0;
	Q.tag=0;
	return OK; 
}
Status EnQueue(SqQueue &Q,ElemType e)
{
	if((Q.tag==1)&&(Q.rear==Q.front))//队满
	return ERROR;
	else
	Q.base[Q.rear]=e;
	Q.rear=(Q.rear+1)%MAXSIZE;
	if(Q.tag==1)
	Q.tag=1;
	return OK; 
}
Status DeQueue(SqQueue &Q,ElemType e)
{
	if((Q.tag==0)&&(Q.rear==Q.front))//队空
	return ERROR;
	e=Q.base[Q.front];
	Q.front=(Q.front+1)%MAXSIZE;
	if(Q.tag==1)
	Q.tag=0; 
    return OK; 
}

我们可以看到队满和空都需要具备两个条件

队满:(Q.tag==1)&&(Q.rear==Q.front)
队空:(Q.tag==0)&&(Q.rear==Q.front)

你可能感兴趣的:(#,栈与队列)