循环队列的创建与实现的函数

bool InitQueue(SqQueue &Q)//循环队列的初始化,为队列申请一段连续的容量为MAXQSIZE的整形数组空间。

{

    cout<<"请输入顺序队列的最大容量:";

    cin>>MAXQSIZE;

  1. 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(每当插入新的队列元素的时候,尾指针rear1;每当删除队头元素的时候,头指针front1.在非空队列中,头指针始终指向队列头元素,而尾指针始终指向队列尾元素的下一个位置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<<"队列已满 ";

    }

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<<"该循环队列是空队列 ";

    }

    Q.front=(Q.front+1)%MAXQSIZE;//队头元素加1

    cout<<"出队成功 ";

}

 

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<<" ";

}

 

void face()//这个函数相当于一个主界面。

{

    cout<<"************************* ";

    cout<<"Creat:    1      print:  2 ";

    cout<<"Pop:   3     Push:  4 ";

    cout<<"Lenght: 5   Esc:  0 ";

    cout<<"************************* ";

    cout<<"请输入选择的序号:(0-5)";//每执行依次主界面都需要执行一次

    //1-5分别是创建队列    输出队列   队列出队   队列入队   求该队列的长度   最后输0的时候退出

}

原文地址:https://www.cnblogs.com/SuperAx/p/13357677.html