</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) { //构造一个空队列Q Q.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返回其值,否则,返回ERROR Status DeQueue(SqQueue &Q,QElemType &e) { if(Q.front==Q.rear)//如果队列为空,返回ERROR return ERROR; e=Q.base[Q.front];//把队首指针赋给e Q.front=(Q.front+1)%MAXQSIZE;//将队首指针向上移动一个位置 //如果队满,则循环到第一个位置 return OK; }
时间: 2024-12-29 23:16:28