队列
队列的基本定义
队列也是一种操作受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除。向队列中插入元素称为入队或进队;删除元素称为出队或离队。这和我们日常生活中的排队时一致的。其操作的特性是先进先出(FIFO)。
队列常见的基本操作
InitQueue(&Q):初始化队列,构造一个空队列Q。
QueueEmpty(Q):判队列为空,若队列Q为空返回true,否则返回false。
EnQueue(&Q,x):入队,若队列Q未满,将x加入,使之称为新的队尾。
DeQueue(&Q,&x):出队,若队列Q非空,删除队头元素,并用x返回。
GetHead(Q,&x):读队头元素,若队列Q非空,则将队头元素赋值给x。
队列的顺序储存
队列的顺序实现是指分配一块连续的存储单元存放队列中的元素,并设两个指针:队头指针front和队尾指针rear。
循环队列
由于顺序队列会造成“假溢出”,于是引出了循环队列的概念。将顺序队列臆造为一个环状的空间。
队列的存储类型:
typedef struct {
ElemType data[MaxSize];
int front, rear;
}SqQueue;
初始化:
void InitQueue(SqQueue& Q) {
Q.front = Q.rear = 0;
}
判空操作:
bool QueueEmpty(SqQueue Q) {
if (Q.front == Q.rear) {
return true;
}
else {
return false;
}
}
入队:
bool EnQueue(SqQueue& Q, ElemType x) {
if ((Q.rear + 1) % MaxSize == Q.front) {//队满
return false;
}
Q.data[Q.rear] = x;
Q.rear = (Q.rear + 1) % MaxSize;
return true;
}
出队:
bool DeQueue(SqQueue& Q, ElemType& x) {
if (Q.front == Q.rear) {//队空
return false;
}
x = Q.data[Q.front];
Q.front = (Q.front + 1) % MaxSize;
return true;
}
读取队头元素:
ElemType GetTop(SqQueue Q) {
return Q.data[Q.front];
}
队列元素的个数:
int QueueLength(SqQueue Q) {
return (Q.rear - Q.front + MaxSize) % MaxSize;
}