顺序队列

来源:互联网 发布:好的算法书籍推荐 编辑:程序博客网 时间:2024/06/07 22:23

队列也是一种运算受限的线性表,只允许在表的一端进行插入,另一端进行删除操作。进行插入的一端称作队尾,进行删除的一端称作队首队头

队列的操作:
向队列中插入新元素称为进队入队,新元素进队后就成为新的队尾元素。
从队列中删除元素称为出队离队,元素出队后,其后继元素称为队首元素。
特点:先进先出(FIFO)

队列的存储结构
队列描述:
data 数据元素:具有同一类型 ElemType,上限MaxSize
front 当前队首:指向队头元素前一个位置
rear 当前队尾:指向队尾元素

typedef struct{    ElemType data[MaxSize];    int front,rear;}SqQueue;

顺序队四要素:
空队:front==rear;
堆满:rear==MaxSize-1;
进队:rear++;data[rear] = e;
出队:front++;e = data[front];

顺序队功能函数
①初始化队列

void InitQueue(SqQueue *&q){    q = (*SqQueue)malloc(sizeof(SqQueue));    q->front = q->rear = -1; }

②销毁队列

void DestroyQueue(SqQueue *&q){    free(q);}

③空队列

bool EmptyQueue(SqQueue *q){    return (q->front==q->rear);}

④进队列EnQueue
条件:队不满
操作:先将rear加1,将元素添加到尾指针位置

bool EnQueue(SqQueue *&q,ElemType e){    if(q->rear==MaxSize-1)        return false;    q->rear++;    q->data[q->rear] = e;    return true;}

⑤出队列DeQueue
条件:队列不为空
操作:front加1,将front指向输出

bool DeQueue(SqQueue *&q,ElemType &e){    if(q->rear==q->front)        return false;    q->front++;    e = q->data[q->front];    return true;}

缺陷:随着不断的入队出队,rear,front指向不断上移,直到都指向表的上限,此时,队列中并没有有效元素,但又不能继续插入,front向下的存储空间也无法再此使用,造成严重浪费。

原创粉丝点击