zoukankan      html  css  js  c++  java
  • 顺序队列

    队列

    队列,和一样,也是一种对数据的"存"和"取"有严格要求的线性存储结构

     

    与栈结构不同的是,队列的两端都"开口",要求数据只能从一端进,从另一端出,如图 1 所示:

    图 1 队列存储结构

     

    队列存储结构的实现有以下两种方式:

    1. 顺序队列:在顺序表的基础上实现的队列结构;
    2. 链队列:在链表的基础上实现的队列结构;

     

    队列的基本运算:

      • 创建一个空队列

      Queue createEmptyQueue ( void )

      • 判队列是否为空队列

      int isEmptyQueue ( Queue qu )

      • 往队列中插入一个元素

      void enQueue ( Queue qu, DataType x )

      • 从队列中删除一个元素

      void deQueue ( Queue qu )

      • 求队列头部元素的值

      DataType frontQueue ( Queue qu )

     

    队列的溢出

      当队列满时,再作进队操作,这种现象称为  上溢;

      当队空时,作删除操作,这种现象称为下溢。

     

      溢出现象在运算中应该加以考虑。

      当paqu->r = MAXNUM时,再作插入运算就会产生溢出,如果这时队列的前端还有许多

      空的(可用的)位置,这种现象称为假溢出。

     

    解决假溢出通常采用的方法

      把数组paqu->q[MAXNUM]从逻辑上看成一个环,即规定paqu->q[0]是paqu->q[MAXNUM -1]的下一个元素。

      采用循环队列,设置队列的尾指针指向下一个可以存储元素的位置,即该位置为空。队列中最多可以存储MAXNUM-1个元素。

      当paqu->q[MAXNUM -1]已经插入元素以后,就把paqu->r置成0,

      再有元素要插入时,就插到paqu->q[0]的位置上,这种队列也称为环形队列

     

    创建一个空队列

    PSeqQueu createEmptyQueue (int m ){
        PSeqQueu paqu;
        paqu =(PSeqQueu)malloc(sizeof(SeqQueue));
        if(paqu!=NULL){
            paqu->element = (DataType*)malloc(sizeof(DataType)*m);
            if (paqu->element)
            {
                paqu->MAXNUM = m;
                paqu->f=paqu->r=0;//首指针和尾指针均指向0
                return paqu;
            }else
            {
                free(paqu);
            }
        }else
        {
            cout<<"Out of space "<<endl; 
            return NULL; 
        }
    }

     

     

    显示队列

    void display(PSeqQueu paqu){
        int index = paqu->f;
        while ((index)%paqu->MAXNUM!=paqu->r)
        {
            cout<<paqu->element[index]<<" ";
            index++;
        }
    }

     

     

    判队列是否为空队列

    int isEmptyQueue ( PSeqQueu paqu ){
        if (paqu->f==paqu->r)    //f 必定指向一个元素,而r没有元素指向
        {
            cout<<"Empty queue"<<endl;
            return 1;
        }
        return 0;
    }
     

    往队列中插入一个元素

    void enQueue ( PSeqQueu paqu, DataType x ){
        if ((paqu->r+1)%paqu->MAXNUM==paqu->f)
        {
            cout<<"the queue is full"<<endl;
        }else
        {
            paqu->element[paqu->r]=x;
            paqu->r=(paqu->r+1)%paqu->MAXNUM;
        }
        return;
    }

     

     

    从队列中删除一个元素

    void deQueue ( PSeqQueu paqu ){
        if (paqu->f==paqu->r)    //f 必定指向一个元素,而r没有元素指向
        {
            cout<<"Empty queue"<<endl;
        }else
        {
            paqu->f=(paqu->f+1)%paqu->MAXNUM;
        }
    }

     

     

    求队列头部元素的值

    DataType frontQueue ( PSeqQueu paqu ){
        if (paqu->f==paqu->r)
        {
            cout<<"Empty "<<endl;
        }else
        {
            return paqu->element[paqu->f];
        }
    }

     

     

     

    因上求缘,果上努力~~~~ 作者:每天卷学习,转载请注明原文链接:https://www.cnblogs.com/BlairGrowing/p/12983808.html

  • 相关阅读:
    机器学习实战-学习笔记-第一章
    Spark高级数据分析中文版-读者交流
    AAS代码第2章
    AWS-CDH5.5安装-软件下载
    AWS-CDH5.5安装 CM配置节点
    AWS-CDH5.5安装-安装
    Spark-1.5.1 on CDH-5.4.7
    tpch-kudu
    kudu playground
    CDH5.4.5运行多字符分割记录
  • 原文地址:https://www.cnblogs.com/BlairGrowing/p/12983808.html
Copyright © 2011-2022 走看看