队列
一、队列的链式存储
链队列示意图:
- 存储结构:
typedef struct QNode{
ElemType data;
struct QNode *next;
}QNode, *QueueNode;
typedef struct{
QueueNode front; //队头指针
QueueNode rear; //队尾指针
}LinkQueue;
//当front==rear时队列为空
- 构造一个带头结点的空队列,且头指针指向头结点
//建立一个带头结点的空队列,且头指针指向头结点
Status InitQueue(LinkQueue &Q)
{
Q.front = Q.rear = (QueueNode)malloc(sizeof(QNode));
if(!Q.front)
return FALSE;
Q.front->next = NULL;
return TRUE;
}
- 进队
//进队
Status EnQueue(LinkQueue &Q, ElemType e)
{
QueueNode p = (QueueNode)malloc(sizeof(QNode));
if(!p)
return FALSE;
p->data = e;
p->next = NULL;
Q.rear->next = p;
Q.rear = p;
return TRUE;
}
- 出队
//出队
Status DeQueue(LinkQueue &Q, ElemType &e)
{
//判断队列是否为空
if(Q.front == Q.rear)
return FALSE;
QueueNode p;
p = Q.front->next;
e = p->data;
Q.front->next = p->next;
if(Q.rear==p)
Q.rear = Q.front;
free(p);
return TRUE;
}
二、队列的顺序存储
第一种
- 存储结构
typedef struct{
ElemType arr[SIZE];
int front; //头指针,若队列不空,指向队列头元素
int rear; //尾指针,若队列不空,指向队尾元素的下一个位置
}SqQueue;
//队空时:front == rear, 队满是:rear == SIZE
- 进队
Status EnQueue(SqQueue &Q, ElemType e)
{
if(Q.rear == SIZE)
return FALSE;
Q.arr[Q.rear] = e;
Q.rear++;
return TRUE;
}
- 出队
Status DeQueue(SqQueue &Q, ElemType &e)
{
if(Q.rear == Q.front)
return FALSE;
e = Q.arr[Q.front];
Q.front++;
return TRUE;
}
第二种(循环队列)
- 存储结构
typedef struct{
ElemType arr[SIZE];
int front; //头指针,若队列不空,指向队列头元素
int rear; //尾指针,若队列不空,指向队尾元素的下一个位置
}SqQueue;
//队列头指针在队列尾指针的下一位置作为队列“满”状态的标志
//队空时:front ==rear,队满时:front == (rear+1)%SIZE
- 进队
//进队
Status EnQueue(SqQueue &Q, ElemType e)
{
if(Q.front == (Q.rear + 1)%SIZE) //队为满
return FALSE;
Q.arr[Q.rear] = e;
Q.rear = (Q.rear+1)%SIZE;
return TRUE;
}
- 出队
//出队
Status DeQueue(SqQueue &Q, ElemType &e)
{
if(Q.front == Q.rear) //队为空
return FALSE;
e = Q.arr[Q.front];
Q.front = (Q.front+1)%SIZE;
return TRUE;
}