本文主要是介绍循环列队的循序结构,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
</pre><pre name="code" class="cpp">//1.队列顺序结构的定义#define MAXQSIZE 100
typedef struct
{QElemType base[MAXQSIZE];//静态数组int front;//队列头指针int rear;//队列尾指针
}SqQueue;//解决队列的假溢出方法
//1.将循序列队臆造为一个环状空间。尾指针指向头指针
//2.在对满的情况下,rear指针和front指针会指向同一个节点元素。
//这时候就相当于对空,因为队列为空的情况下,rear和front指针指向同一元素//循环队列怎么区分对空和对满呢???
//解决办法;//1.因出对而相等,则为空。因入队而相等,则为满
//2.少用一个元素的空间,约定rear+1=front时,就认为对满//2.循环队列,队列顺序存储结构的虚拟实现#define MAXQSIZE 100//最大列队长度
typedef struct
{QElemType *base;//初始化的动态分配存储空间int front;//头指针,若对不空,指向队列头元素int rear;//尾指针,若队列不空,指向队尾元素的下一位置
}SqQueue;//3.基本操作Status InitQueue(SqQueue &Q)
{//构造一个空队列QQ.base=(QElemType*)malloc(//开辟队列的内存空间MAXQSIZE*sizeof(QElemType));if(!Q.base)//如果队尾不存在,那么开辟空间失败exit(OVERFLOW);Q.front=Q.rear=0;//空队列return OK;
}//4.求队列长度int QueueLength (SqQueue Q)
{//返回Q的元素个数,即队列的长度return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;//由于rear也可能小于front,所以这个方法比较实用,相当于求//rear-front的绝对值。
}//5.插入元素E为Qde 新队尾元素Status EnQueue(SqQueue &Q,QElemType e)
{if((Q.rear+1)%MAXQSIZE==Q.front)//判断是否为对满return ERROR;Q.base[Q.rear]=e;//让新插入的元素为队尾元素Q.rear=(Q.rear+1)%MAXQSIZE;//移动到下一位,如果对满,那么取余到达第一元素位置return OK;
}//6.入队和出队
//入队:rear=rear+1;入队队尾元素加一a4->a5->a6;一次增加
//出队:front=front+1 出队时队首元素加一a4->a3->a2->a1,从右到左出队//7.若队不空,则删除队头元素,用e返回其值,否则,返回ERRORStatus DeQueue(SqQueue &Q,QElemType &e)
{if(Q.front==Q.rear)//如果队列为空,返回ERRORreturn ERROR;e=Q.base[Q.front];//把队首指针赋给eQ.front=(Q.front+1)%MAXQSIZE;//将队首指针向上移动一个位置//如果队满,则循环到第一个位置return OK;
}
这篇关于循环列队的循序结构的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!