3.2.1 队列的定义
![](https://i-blog.csdnimg.cn/blog_migrate/bba398fad76a60e177a21bec2547cc7e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/255c4dec66b983e853aab8e7bc377ddd.png)
//此处 牺牲一个位置 来区分队列的 判空 和 满列
bool QueueFull(SqQueue &Q)//队满
{
return (Q.rear + 1) % MaxSize == Q.front;
}
3.2.2 顺序队列
1)定义
#define MaxSize 10 //定义 队列 元素最大数
typedef struct SqQueue
{
int data[MaxSize];
int front, rear; //队列 头 尾
}SqQueue;
2)队列 初始化
void InitQueue(SqQueue &Q)//初始化队列
{
Q.front = Q.rear = 0;
}
3)队列 判空
bool QueueEmpty(SqQueue &Q)//队列判空
{
return Q.front == Q.rear;
}
4)入队
bool EnQueue(SqQueue &Q, int x)//入队
{
if (QueueFull(Q))return false;
Q.data[Q.rear] = x;
Q.rear = (Q.rear + 1) % MaxSize; //循环起来
return true;
}
5)出队
bool DeQueue(SqQueue &Q, int &x)//出队
{
if (QueueEmpty(Q))return false;
x = Q.data[Q.front];
Q.front = (Q.front + 1) % MaxSize; //循环起来
return true;
}
6)读队(头)
bool GetHead(SqQueue &Q, int &x)//读队(头)
{
if (QueueEmpty(Q))return false;
x = Q.data[Q.front];
return true;
}
7)队长
int QueueLen(SqQueue &Q)//队长
{
return (Q.rear + MaxSize - Q.front) % MaxSize;
}
3.2.3 队列 链式存储
//带头结点的链队的入队操作,只要把新生成的结点加到尾结点后即可
//而不带头结点的操作则还要注意到边界操作
//假如是第一次入队 需修改队头指针
//同样的道理 对于出队操作 假如是最后一个结点出队 需要注意修改队尾指针
//由此,我们建议链式队列最好采用带头结点的实现方式
typedef struct LNode //结点
{
int data;
LNode *next;
}LNode;
typedef struct LinkQueue//链队列
{
LNode *front, *rear;
}LinkQueue;
2)初始化
void InitQueue(LinkQueue &Q)//初始化
{
Q.front = Q.rear = (LNode*)malloc(sizeof(LNode));
Q.front->next = NULL;
}
3)判空
bool QueueEmpty(LinkQueue &Q)//判空
{
return Q.front == Q.rear;
}
4)入队
bool EnQueue(LinkQueue &Q, int x)//入队
{
LNode *p = (LNode*)malloc(sizeof(LNode));
if (p == NULL)return false;
p->data = x;
p->next = NULL;
Q.rear->next = p; //新结点插入到表尾rear后
Q.rear = p; //修改表尾rear指向
return true;
}
5)出队
bool DeQueue(LinkQueue &Q, int &x)//出队
{
if (QueueEmpty(Q))return false;
LNode *p = Q.front->next;
Q.front->next = p->next;
x = p->data;
if (p == Q.rear) //删除的结点恰好为表尾 需修改表尾
Q.rear = Q.front;
free(p);
return true;
}
6)读队(头)
bool GetHead(LinkQueue &Q, int &x)//读队(头)
{
if (QueueEmpty(Q))return false;
x = Q.front->next->data;
return true;
}
3.2.4 双端队列