队列
只允许再一端进行插入,在另一端删除
队尾:允许插入
队头:允许删除
特点:先进先出 FIFO
队空条件: Q.rear == Q.front
队满条件:(Q.rear +1) % MaxSize == Q.front
队列元素个数:(rear + Maxsize - front)% Maxsize
typedef struct{
ElemType data[MaxSize]; //用静态数组存放队列元素
int front, rear; //队头,队尾指针
}SqQueue;
void InitQueue(SqQueue &Q){
Q.rear=Q.front= 0; //初始时 队头、队尾指针指向0
}
bool EnQueue(SqQueue &Q, ElemType x){
if (队列已满)
return false;
Q.data[Q.rear] = x; //将x插入队尾
Q.rear = Q.rear+1;//队尾指针加一
return true;
}
牛逼循环队列
bool EnQueue(SqQueue &Q, ElemType x){
if (队列已满)
return false;
Q.data[Q.rear] = x; //将x插入队尾
Q.rear = (Q.rear+1) % MaxSize;//队尾指针加一取余 循环队列
return true;
}
出队
bool DeQueue(SqQueue &Q, ElemType & x){
if(Q.rear == Q.front) //判断队空
return false;
x = Q.data[Q.front];
Q.front = (Q.front+1)% MaxSize;
return true;
}
查
bool GetHead(SqQueue Q, ElemType & x){
if(Q.rear == Q.front) //判断队空
return false;
x = Q.data[Q.front];
return true;
}
一般的循环队列中需要空出一个区域来判断队满和对空
但是还可以
typedef struct{
ElemType data[MaxSize]; //用静态数组存放队列元素
int front, rear; //队头,队尾指针
int size;
}SqQueue;
利用size判断,这样可以节省一个空间
size == MaxSize,满
size == 0,空
还可以用tag
typedef struct{
ElemType data[MaxSize]; //用静态数组存放队列元素
int front, rear; //队头,队尾指针
int tag;
}SqQueue;
tag = 0时,最近执行了一次删除,
tag = 1时,最近执行了一次插入
front == rear&&tag == 1,满
front == rear&&tag == 0,空