写在前面:博主是一位普普通通的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)