在学习队列之前,我们可以先复习巩固一下栈的各种操作。
原文博客如下 顺序表实现栈的各种操作
一、队列的特点
就跟排队一样,先进先出。
二、循环队列的操作
三、代码实现
结构体
#define MaxSize 5
typedef int ElemType;
typedef struct {
ElemType data[MaxSize]; // 存储MaxSize-1个元素
int front, rear; // 队列头 队列尾
}SqQuene;
1.初始化队列
// 初始化队列
void InitQuene(SqQuene& Q) {
Q.front = Q.rear = 0;
}
2.判断队列是否为空
// 判断队列是否为空
bool QueneEmpty(SqQuene Q) {
if (Q.front == Q.rear) {
return true;
}
return false;
}
3.入队
// 入队
bool EnQuene(SqQuene& Q, ElemType m) {
// 若队列满则不能入队列
if ((Q.rear + 1) % MaxSize == Q.front) {
return false;
}
Q.data[Q.rear] = m;
Q.rear = (Q.rear + 1) % MaxSize; // 尾指针向后移动一格
return true;
}
4.出队
// 出队
bool DeQueue(SqQuene& Q, ElemType& m) {
// 若队列为空则不能出队
if (Q.rear == Q.front) {
return false;
}
m = Q.data[Q.front];
Q.front = (Q.front + 1) % MaxSize; // 头指针向后移动一格
return true;
}
完整代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 5
typedef int ElemType;
typedef struct {
ElemType data[MaxSize]; // 存储MaxSize-1个元素
int front, rear; // 队列头 队列尾
}SqQuene;
// 初始化队列
void InitQuene(SqQuene& Q) {
Q.front = Q.rear = 0;
}
// 判断队列是否为空
bool QueneEmpty(SqQuene Q) {
if (Q.front == Q.rear) {
return true;
}
return false;
}
bool EnQuene(SqQuene& Q, ElemType m) {
// 若队列满则不能入队列
if ((Q.rear + 1) % MaxSize == Q.front) {
return false;
}
Q.data[Q.rear] = m;
Q.rear = (Q.rear + 1) % MaxSize; // 尾指针向后移动一格
return true;
}
bool DeQueue(SqQuene& Q, ElemType& m) {
// 若队列为空则不能出队
if (Q.rear == Q.front) {
return false;
}
m = Q.data[Q.front];
Q.front = (Q.front + 1) % MaxSize; // 头指针向后移动一格
return true;
}
int main()
{
SqQuene Q;
InitQuene(Q);
bool flag;
flag = QueneEmpty(Q);
if (flag) {
printf("队列为空\n");
}
// 往队列里添加元素
bool ret;
EnQuene(Q, 3);
EnQuene(Q, 4);
EnQuene(Q, 5);
ret = EnQuene(Q, 6);
ret = EnQuene(Q, 7); // 队列满进不去
if (ret) {
printf("入队成功\n");
}
else {
printf("入队失败\n");
}
bool res;
ElemType m; // 存储出队的元素
res = DeQueue(Q, m);
if (res) {
printf("出队成功,出队元素为%d\n", m);
}
else {
printf("出队失败\n");
}
return 0;
}
加油你一定能学会的)