顺序循环队列
- 在判断队空和队满时有3种方法,看教材
- 这里列举其中一种
#pragma once
#include <stdio.h>
#define maxSize 100
typedef int ElemType;
typedef struct {
int rear, front; //front指向队头第一个,rear指向队尾的下一个
ElemType data[maxSize];
} SeqQueue;
//初始化
void initQueue(SeqQueue &q) {
q.front = q.rear = 0;
}
//判断空
bool isEmpty(SeqQueue q) {
return q.rear == q.front;
}
//入队
bool enQueue(SeqQueue &q, ElemType x) {
if ((q.rear + 1) % maxSize == q.front) return false; //已满的情况
q.data[q.rear] = x;
q.rear %= maxSize;
return true;
}
//出队
bool deQueue(SeqQueue &q, ElemType &x) {
if (q.rear == q.front) return false;
x = q.data[q.front];
q.front = (q.front + 1) % maxSize;
return true;
}
//获取队头元素
ElemType getTop(SeqQueue q) {
if (q.rear == q.front) return false;
return q.data[q.front];
}
//计算对内元素的个数
int getNum(SeqQueue q){
return (q.rear + maxSize -q.front) % maxSize;
}
链式队列
#pragma once
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct Node {
ElemType data;
struct Node *next;
} LinkNode;//强调的是节点
typedef struct {
LinkNode *front, *rear;
} LinkQueue;//强调的是队列
//初始化
void initQueue(LinkQueue &q) {
q.front = q.rear = (LinkNode *) malloc(sizeof(LinkNode));
q.front->next = NULL;
}
//判断空
bool isEmpty(LinkQueue q) {
return q.front == q.rear; //或者写q.front->next == NULL;
}
//入队(带头结点的)
void enQueue(LinkQueue &q, ElemType x) {
LinkNode *p = (LinkNode *) malloc(sizeof(LinkNode));
p->data = x;
p->next = NULL;
q.rear->next = p;
q.rear = p;
}
//如果是无头节点的入队,需要判断处理一下对头
void enQueueNoHead(LinkQueue &q, ElemType x) {
LinkNode *p = (LinkNode *) malloc(sizeof(LinkNode));
p->data = x;
p->next = NULL;
//空队列的情况
if (q.front == NULL) {
q.rear = p;
q.front = p;
} else {
q.rear->next = p;
q.rear = p;
}
}
//带头结点的出队
bool deQueue(LinkQueue &q, ElemType &x) {
if (q.rear == q.front) return false;//队空
LinkNode *p = q.front->next;
x = p->data;
q.front->next = p->next;
//如果删除的是最后一个元素
if (p == q.rear)//或者p == NULL
q.rear == q.front;
free(p);
return true;
}
//不带多节点的出队
bool deQueueNoHead(LinkQueue &q, ElemType &x) {
if (q.front == NULL) return false;
LinkNode *p = q.front;
x = p->data;
q.front = p->next;
if (q.rear == p) {//或者q.front == NULL
q.front = NULL;
q.rear = NULL;
}
free(p);
return true;
}