顺序队列
队列
队列,和栈一样,也是一种对数据的"存"和"取"有严格要求的线性存储结构。
与栈结构不同的是,队列的两端都"开口",要求数据只能从一端进,从另一端出,如图 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];
}
}
因上求缘,果上努力~~~~ 作者:图神经网络,转载请注明原文链接:https://www.cnblogs.com/BlairGrowing/p/12983808.html