码迷,mamicode.com
首页 > 其他好文 > 详细

顺序队列

时间:2020-05-28 21:59:49      阅读:77      评论:0      收藏:0      [点我收藏+]

标签:htm   循环   splay   done   存储   18C   a20   classic   溢出   

队列

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

 

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

 


 

顺序队列

标签:htm   循环   splay   done   存储   18C   a20   classic   溢出   

原文地址:https://www.cnblogs.com/BlairGrowing/p/12983808.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!