队列也是一种运算受限的线性表,只允许在表的一端进行插入,另一端进行删除操作。进行插入的一端称作队尾,进行删除的一端称作队首或队头。
队列的操作:
向队列中插入新元素称为进队或入队,新元素进队后就成为新的队尾元素。
从队列中删除元素称为出队或离队,元素出队后,其后继元素称为队首元素。
特点:先进先出(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向下的存储空间也无法再此使用,造成严重浪费。