王道-考研-数据结构-队列【queue】
队列【循环队列】
1. 队列的顺序实现
1.1. 定义
用顺序存储方式实现的队列。
#define MaxSize 10
typedef struct
{
ElemType data[MaxSize];
int front, rear; // 队头、队尾指针
} SqQueue;
\(MaxSize*sizeof(ElemType)+8B\)
1.2. 初始化队列
// 初始化队列
void InitQueue(SqQueue &Q)
{
Q.front = Q.rear = 0;
}
// 判断队列是否为空
bool QueueEmpty(SqQueue Q)
{
return Q.rear == Q.front;
}
// 判断队列是否已满
bool QueueFull(SqQueue Q)
{
return (Q.rear + 1) % MaxSize == Q.front;
}
// 获取队长
int Length(SqQueue Q)
{
return (Q.rear + MaxSize - Q.front) % MaxSize;
}
1.3. 入队
队尾指针指向队尾元素的下一个位置。
// 入队
bool EnQueue(SqQueue &Q, int x)
{
if (QueueFull(Q))
{
return false;
}
Q.data[Q.rear] = x;
Q.rear = (Q.rear + 1) % MaxSize;
return true;
}
1.4. 出队
// 出队
bool DeQueue(SqQueue &Q, int x)
{
if (QueueEmpty(Q))
{
return false;
}
x = Q.data[Q.front];
Q.front = (Q.front + 1) % MaxSize;
return true;
}
1.5. 获取队头元素
// 读取队头元素
bool GetHead(SqQueue &Q, int &x)
{
if (QueueEmpty(Q))
{
return false;
}
x = Q.data[Q.front];
return true;
}
1.6. 不要浪费最后一个空位
加入辅助变量。
1.6.1. size
#define MaxSize 10
typedef struct
{
ElemType data[MaxSize];
int front, rear;
int size;
} SqQueue;
- 初始时:
Q.front = Q.rear = 0;
,Q.size = 0;
- 入队:
Q.size++;
- 出队:
Q.size--;
- 队满条件:
Q.size == MaxSize;
- 队空条件:
Q.size == 0;
1.6.2. tag
#define MaxSize 10
typedef struct
{
ElemType data[MaxSize];
int front, rear;
int tag;
} SqQueue;
- 初始时:
Q.front = Q.rear = 0;
,Q.tag = 0;
- 入队:
Q.tag = 1;
,只有入队操作,才能导致队满。 - 出队:
Q.tag = 0;
,只有出队操作,才能导致队空。 - 队满条件:
Q.front == Q.rear && Q.tag == 1;
- 队空条件:
Q.front == Q.rear && Q.tag == 0;
1.7. 队尾指针指向队尾元素
入队:【先移动,在进行插入】
Q.rear = (Q.rear + 1) % MaxSize;
Q.data[Q.rear] = x;
初始化:
Q.front = 0;
Q.rear = MaxSize - 1;
判空:
(Q.rear + 1) % MaxSize == Q.front;
判满(牺牲一个存储单元):
(Q.rear + 2) % MaxSize == Q.front;
2. 队列的链式实现
2.1. 定义
typedef struct LNode
{
ElemType data;
struct LNode *next;
} LNode;
typedef struct
{
LNode *front, *rear; // 队列的队头、队尾指针
} LinkQueue;
2.2. 初始化
// 初始化队列
bool InitQueue(LinkQueue &Q)
{
LNode *s = (LNode *)malloc(sizeof(LNode));
if (s == NULL)
{
return false;
}
s->next = NULL;
Q.front = Q.rear = s;
return true;
}
// 判断队列是否为空
bool QueueEmpty(LinkQueue Q)
{
return Q.rear == Q.front;
}
2.3. 入队【操作Rear】
// 入队
bool EnQueue(LinkQueue &Q, int x)
{
LNode *s = (LNode *)malloc(sizeof(LNode));
s->data = x;
s->next = NULL;
Q.rear->next = s;
Q.rear = s;
return true;
}
2.4. 出队【操作Front】
// 出队
bool DeQueue(LinkQueue &Q, int x)
{
if (QueueEmpty(Q))
{
return false;
}
LNode *q = Q.front->next;
x = q->data;
Q.front->next = q->next;
if (Q.rear == q) // 如果是最后一个结点出队
{
Q.rear = Q.front;
}
free(q);
return true;
}
2.5. 获取队头元素
// 读取队头元素
bool GetHead(LinkQueue &Q, int &x)
{
if (QueueEmpty(Q))
{
return false;
}
LNode *q = Q.front->next;
x = q->data;
return true;
}
2.6. 不带头结点
// 初始化队列
bool InitQueue(LinkQueue &Q)
{
Q.front = Q.rear = NULL;
return true;
}
// 判断队列是否为空
bool QueueEmpty(LinkQueue Q)
{
return Q.front = NULL;
}
// 入队
bool EnQueue(LinkQueue &Q, int x)
{
LNode *s = (LNode *)malloc(sizeof(LNode));
s->data = x;
s->next = NULL;
if (Q.front == NULL)
{
Q.front = s;
Q.rear = s;
}
else
{
Q.rear->next = s;
Q.rear = s;
}
return true;
}
// 出队
bool DeQueue(LinkQueue &Q, int x)
{
if (QueueEmpty(Q))
{
return false;
}
LNode *q = Q.front;
x = q->data;
Q.front = q->next;
if (Q.rear == q) // 如果是最后一个结点出队
{
Q.front = NULL;
Q.rear = NULL;
}
free(q);
return true;
}
// 读取队头元素
bool GetHead(LinkQueue &Q, int &x)
{
if (QueueEmpty(Q))
{
return false;
}
LNode *q = Q.front;
x = q->data;
return true;
}
本文来自博客园,作者:咸瑜,转载请注明原文链接:https://www.cnblogs.com/bi-hu/p/16685612.html