• 顺序队列


    队列

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

     

    与栈结构不同的是,队列的两端都"开口",要求数据只能从一端进,从另一端出,如图 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

  • 相关阅读:
    什么是二进制补码
    第四章 VB程序的控制结构
    第三章 VB的程序设计基础
    C#學習基礎方法
    C#學習基礎繼承
    C#學習基礎變量和常量
    C#學習基礎域和屬性
    第八章 VB中ActiveX控件的使用
    写给WEB2.0的站长 不仅仅是泼冷水(转)
    常见错误和难点分析
  • 原文地址:https://www.cnblogs.com/BlairGrowing/p/12983808.html
Copyright © 2020-2023  润新知