数据结构之队列的顺序表示

(一)队列

队列是仅在表尾进行插入操作,表头进行删除操作的线性表,是一种先进先出的线性表
入队操作尾指针,出队移动头指针。
队列的存储结构为链队或者顺序队(常用循环顺序队)

1. 抽象数据结构

ADT Queue{
    D = {ai|ai ∈E了吗Set,i=12...,n>=0} // 数据对象
    R = {<a(i-1),ai>|a(i-1), ai ∈D,I = 2,...,n} // 数据关系
    // 约定其中a1端为队列头,an端为队列尾
} ADT Queue

(二)队列的顺序表示和实现

#define MAXQSIZE 100         // 最大队列长度
Typedef struct{              
    QElenType *base          // 初始化的动态分配储存空间
    int front                // 头指针
    int rear                 // 尾指针
}

1.循环队列的实现

当rear = MAXQSIZE时,会发生溢出,
就是当front  != 0 但是 rear = MAXQSIZE时,会发生入队假溢出。

解决方案

将队空间设想成一个循环的表,即分配给队列的m个储存单元可以循环使用,当rear为maxqsize时,若向量的开始端空着,又可以从头使用空着的空间。当front 为maxqsize时,也是一样。

实现方案:求余数,当位置小于最大位置时候取余为自己。但是当等于最大长度时为0,回到起点。
缺点:当front = rear 时候,不能判断是队空还是队满

插入元素:Q.base[Q.rear] = x
Q.rear = (Q.rear + 1)%MAXQSIZE

删除元素:x = Q.base[s.front]
Q.front = (Q.front + 1)%MAXQSIZE

少用一个元素空间用于解决循环队列的判断方法
队空:front = rear 
队满: (rear+1)%MAXQSIXZE = front

(1)循环队列的数据结构

#define MAXQSIZE 100         // 最大队列长度
Typedef struct{              
    QElenType *base          // 初始化的动态分配储存空间
    int front                // 头指针,若队列不为空,指向队列头元素
    int rear                 // 尾指针,若队列不为空,指向队列尾元素的下一个位置
}SQqueue

(2)队列的初始化

Status InitQueue(SqQueue &Q){
    Q.base = new QElemType[MAXQSIZE]        // 分配数值空间
    if(!Q.base) exit (OVERFLOW)             // 分配失败
    Q.front = Q.rear =0                     // 初始化头尾指针,头尾指针置0,队列为空
    return OK
}

(3)求队列的长度

int QueueLength(SqQueu Q){
    return (Q.rear - Q.front +MAXQSIZE)%MAXQSIZE)
}

(4)队列的入队

Status EnQueue(SqQueue &Q, QElemType e) {
    if((Q.rear+1)%MAXQSIZE == Q.front) return ERROR  // 判断是否队满
    Q.rear = (Q.rear + 1)%MAXQSIZE                   // 队尾指针+1
    return OK    
}

(5)队列的出队

Status DeQueue(SqQueue &Q, QElemType &e) {
    if(Q.front == Q.rear) return ERROR               // 判断是否队空
    e = Q.base[Q.front]                              // 保存队头元素
    Q.front = (Q.front + 1)%MAXQSIZE                 // 队头指针+1
    return OK    
}

(6)队列取队头元素

SElemType GetHead(SqQuere Q)  {
    if(Q.front != Q.rear) return Q.base[Q.front]    // 队列不为空,返回队头指针元素的值,队头指针不变
}






 

posted @   铜须的编程生活  阅读(258)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示