zoukankan      html  css  js  c++  java
  • 循环队列的创建与实现的函数

    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的时候退出

    }

  • 相关阅读:
    Android实现文件上传功能(接收端用strust2)
    创建一个多页面,基于UINavigationController的控制的跳转的iOS应用程序
    NSURL中带有汉字参数的乱码处理
    Google Directions API通过请求获取导航数据简介
    iOS下用UIWebView打开文档
    关于Objectivec和Java下DES加密保持一致的方式
    struts2中通过Action以InputStream的下载文件以及在iOS以及Android端接收的实现方式
    NSURL中的参数带有特殊字符的处理
    UIColor设置自定义的颜色不成功问题
    Android中TabHost中实现标签的滚动以及一些TabHost开发的奇怪问题
  • 原文地址:https://www.cnblogs.com/SuperAx/p/13357677.html
Copyright © 2011-2022 走看看