循环队列的创建与实现的函数
bool InitQueue(SqQueue &Q)//循环队列的初始化,为队列申请一段连续的容量为MAXQSIZE的整形数组空间。
{
cout<<"请输入顺序队列的最大容量:";
cin>>MAXQSIZE;
- base=new int[MAXQSIZE];//q.base是电脑给队列动态分配的存储空间,new的作用是
(1):获得一块内存空间
(2):返回正确的指针
if(!Q.base)//如果Q.base的值为空,则说明申请失败,返回false
{
return false;
}
Q.front=Q.rear=0;//Q.front表示队头指针,Q.rear表示队尾指,这是约定俗成的初始化创建空队列时,Q.front=Q.rear=0
return true;
}
int Queuelength(SqQueue Q)//计算队列的长度,由于队列无需被改变,所以不使用“&”进行引用。
{
return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;//Q.rear,Q.front,MAXSIZE都是整数,在求余运算中,加上或者减去最大容量对结果没有影响。
}
入队三步走:
1:判断队列是否满,若满则返回ERROR
2:将新元素插入队尾
3:队尾指针加1(每当插入新的队列元素的时候,尾指针rear增1;每当删除队头元素的时候,头指针front增1.在非空队列中,头指针始终指向队列头元素,而尾指针始终指向队列尾元素的下一个位置120 )
void EnQueue(SqQueue &Q,int e)//入队列操作,1:先判断队列是否满 2:把数值队尾入队 3:队尾指针加1//(1):循环队列就是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间。
(2)当存储空间的最后一个位置已被使用而再要进入队运算时,只需要存储空间的第一个位置空闲,便可将元素加入到第一个位置,即将存储空间的第一个位置作为队尾。
(2):循环队列中,当队列为空时,有front=rear,而当所有队列空间全占满时,也有front=rear.为了区别这两种情况,规定循环队列最多只能有MaxSize-1个队列元素,当循环队列中只剩下一个空存储单元时,队列就已经满了。因此,队列判空的条件是front=rear,而队列判满的条件是front=(rear+1)%MaxSize
{
if((Q.rear+1)%MAXQSIZE==Q.front)//循环队列中还剩下一个位置就默认队列已经满了。对应1判断,在队列中还剩下一个位置时就默认队列满,此时(Q.rear+1)%MAXQSIZE==Q.front
//front指定队首位置,删除一个元素就将front顺时针移动一位;
rear指向元素要插入的位置,插入一个元素就将rear顺时针移动一位;
count存放队列中元素的个数,当count等于MaxQSize时,不可再向队列中插入元素。
{
cout<<"队列已满\n";
}
Q.base[Q.rear]=e;//刚开始Q.front=Q.rear=0,头指针和尾指针置0,表示队列为空。base指向数组空间的首地址。Q.base是该空间基地址,Q.rear是偏移地址.表示新元素插入队尾。对于非循环队列,尾指针和头指针的差值便是队列长度,对于循环队列,差值可能为负数,所以需要将差值加上MAXQSIZE,然后再对MAXQSIZE取余。//入队操作是指在队尾插入一个新的元素。
Q.rear=(Q.rear+1)%MAXQSIZE;//最后队尾指针加1.
}
void DeQueue(SqQueue &Q )//出队列1:判断是否为空2:保存队头元素3:队头指针加1
{
if(Q.front==Q.rear)//如果Q.front==Q.rear则循环为空
{
cout<<"该循环队列是空队列\n";
}
Q.front=(Q.front+1)%MAXQSIZE;//队头元素加1
cout<<"出队成功\n";
}
void PrintQueue(SqQueue Q)//该函数的作用是输出循环队列中的元素,由于队列未被改变,则不采用引用。
{
while(Q.front!=Q.rear)//循环的条件是该队列非空则执行循环体
{
cout<<Q.base[Q.front];//输出队头元素所指向的值
Q.front=(Q.front+1)%MAXQSIZE;//队头指针加1
}//执行该循环体,一直输出队列元素,直至Q.rear=Q.front时即队列为空时循环结束
cout<<"\n";
}
void face()//这个函数相当于一个主界面。
{
cout<<"*************************\n";
cout<<"Creat: 1 print: 2\n";
cout<<"Pop: 3 Push: 4\n";
cout<<"Lenght: 5 Esc: 0\n";
cout<<"*************************\n";
cout<<"请输入选择的序号:(0-5):";//每执行依次主界面都需要执行一次
//1-5分别是创建队列 输出队列 队列出队 队列入队 求该队列的长度 最后输0的时候退出
}