- 顺序队列=====假溢出
循环队列
- 初始化—– Q.front=Q.rear=0
- 队首指针进1—Q.front=(Q.front+1)%MaxSize
- 队尾指针进1—Q.rear=(Q.rear+1)%MaxSize
- 队列长度——(Q.rear+MaxSize-Q.front)%MaxSize
- 出队入队:指针都顺时针进1
判断队列是否是空
- 牺牲一个单元来区分对空和对满:入队时少用一个单元==对头指针在队尾指针的下一个位置作为对满的标志
- 队满: (Q.rear+1)%MaxSize==Q.front
- 队空:Q.front==Q.rear
- 队列的元素个数: (Q.rear-Q.front+MaxSize)%MaxSize
- 数据结构
typedef int Status;
typedef int QElemType; /* QElemType类型根据实际情况而定,这里假设为int */
/* 循环队列的顺序存储结构 */
typedef struct
{
QElemType data[MAXSIZE];
int front; /* 头指针 */
int rear; /* 尾指针,若队列不空,指向队列尾元素的下一个位置 */
}SqQueue;
- 基本函数
/* 初始化一个空队列Q */
Status InitQueue(SqQueue *Q)
{
Q->front=0;
Q->rear=0;
return OK;
}
/* 若队列Q为空队列,则返回TRUE,否则返回FALSE */
Status QueueEmpty(SqQueue Q)
{
if(Q.front==Q.rear) /* 队列空的标志 */
return TRUE;
else
return FALSE;
}
/* 返回Q的元素个数,也就是队列的当前长度 */
int QueueLength(SqQueue Q)
{
return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
}
/* 若队列不空,则用e返回Q的队头元素,并返回OK,否则返回ERROR */
Status GetHead(SqQueue Q,QElemType *e)
{
if(Q.front==Q.rear) /* 队列空 */
return ERROR;
*e=Q.data[Q.front];
return OK;
}
/* 若队列未满,则插入元素e为Q新的队尾元素 */
Status EnQueue(SqQueue *Q,QElemType e)
{
if ((Q->rear+1)%MAXSIZE == Q->front) /* 队列满的判断 */
return ERROR;
Q->data[Q->rear]=e; /* 将元素e赋值给队尾 */
Q->rear=(Q->rear+1)%MAXSIZE;/* rear指针向后移一位置, */
/* 若到最后则转到数组头部 */
return OK;
}
/* 若队列不空,则删除Q中队头元素,用e返回其值 */
Status DeQueue(SqQueue *Q,QElemType *e)
{
if (Q->front == Q->rear) /* 队列空的判断 */
return ERROR;
*e=Q->data[Q->front]; /* 将队头元素赋值给e */
Q->front=(Q->front+1)%MAXSIZE; /* front指针向后移一位置, */
/* 若到最后则转到数组头部 */
return OK;
}
练习题
q1是专职进出栈的,q2只是个中转站
入栈:直接入队列q1即可
- 出栈:把q1的除最后一个元素外全部转移到队q2中,然后把刚才剩下q1中的那个元素出队列。之后把q2中的全部元素转移回q1中
void Push(Queue *q1, Queue *q2, int k)
{
EnQueue(q1, k);
}
int Pop(Queue *q1, Queue *q2)
{
int tmp;
if(IsQueueEmpty(q1) == 1)
{
printf("Stack Empty!\n");
}
else
{
while(SizeOfQueue(q1) != 1)
{
EnQueue(q2, DeQueue(q1));
}
tmp = DeQueue(q1);
while(IsQueueEmpty(q2) == 0)
{
EnQueue(q1, DeQueue(q2));
}
return tmp;
}
}