顺序队列
Posted blairgrowing
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了顺序队列相关的知识,希望对你有一定的参考价值。
队列
队列,和栈一样,也是一种对数据的"存"和"取"有严格要求的线性存储结构。
与栈结构不同的是,队列的两端都"开口",要求数据只能从一端进,从另一端出,如图 1 所示:
图 1 队列存储结构
队列存储结构的实现有以下两种方式:
队列的基本运算:
• 创建一个空队列
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]; } }
以上是关于顺序队列的主要内容,如果未能解决你的问题,请参考以下文章