文章目录
一、队列的基本操作
二、队列(顺序队)的实现
#define MaxSize 50
#define ElemType int
typedef struct
{
int front;//队首
int rear;//队尾
ElemType data[MaxSize];
}SqQueue;
2.1 队列的初始化
queue->front = queue.rear = 0
void InitQueue(SqQueue *&queue){
queue = (SqQueue*)malloc(sizeof(SqQueue));
queue->front = queue.rear = 0;
}
2.2 入队和出队
bool enQueue(SqQueue *&q,ElemType e)
{ if (q->rear == MaxSize-1) //队满上溢出
return false;
q->rear=(q->rear+1)%MaxSize;
q->data[q->rear]=e;
return true;
}
bool deQueue(SqQueue *&q,ElemType &e)
{ if (q->front==q->rear) //队空下溢出
return false;
q->front=(q->front+1)%MaxSize;
e=q->data[q->front];
return true;
}
三、循环队列(顺序队)
注意,此时Q.rear 指向一个没有数据的单元
- 队空条件:Q.rear == Q.front
- 队满条件:Q.front == (Q.rear+1)%MaxSize
3.1 循环队列的初始化
void InitQueue(CircleQueue *&cq){
cq->front = cq->rear = 0;
}
3.2 判断队空
bool IsEmpty(CircleQueue *&cq){
if(cq->front == cq->rear)
return true;
return false;
}
3.3 入队
bool EnQueue(CircleQueue *&cq, ElemType e){
//判断队列是否满
if((cq->rear+1)%MaxSize == cq->front)
return false;
cq->data[cq->rear] = e;
cq->rear = (cq->rear+1)%MaxSize;
return true;
}
3.4 出队
bool DeQueue(CircleQueue *&cq, ElemType &e){
//判断是否空
if(cq->front == cq->rear)
return false;
e = cq->data[cq->front];
cq->front = (cq->front+1)%MaxSize;
return true;
}
四、链队
//节点
typedef struct
{
ElemType data;
struct LinkNode *next;
}LinkNode;
//队列
typedef struct
{
LinkNode *front,*rear;
}LinkQueue;
4.1 链队的初始化
void InitQueue(LinkQueue *&q){
q->front = (LinkNode*)malloc(sizeof(LinkNode));
q->rear = q->front;
q->front->next = NULL;
}
4.2 判断队列是否为空
bool IsEmpty(LinkQueue *&q){
return q->front == q->rear;
}
4.3 入队和出队
void EnQueue(LinkQueue *&q, ElemType e){
LinkNode *s = (LinkNode *)malloc(sizeof(LinkNode));
s->data = e;
s->next = NULL;
q->rear->next = s;
q->rear = s;
}
bool DeQueue(LinkQueue *&q, ElemType &e){
if(q->front == q->rear)
return false;
LinkNode *p = q->front->next;
e = p->data;
q->front->next = p->next;
//如果p是最后一个元素,则让尾部指针指向头指针
if(q->rear == p)
q->rear = q->front;
free(p);
return true;
}