数据结构学习笔记:队列
前言
本文将了队列的定义,操作,应用和总结等。所举例的为基于数组的循环队列。
ps:为何在进行入队出队的时候不直接让front++和rear++,而是用(front+1)%6和(rear+1)%6?
当用++时,当到了数组最后一个元素的时,再用++即超过了数组范围,而用(front+1)%6和
rear+1)%6能避免这种情况,当加到最后一个再加时,能自动返回到第一个个数组元素。
一、定义
如百科所言,队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,即(先入先出,后入后出)和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
typedef struct Queue
{
int front ;//指向队列头部的指针
int rear;//指向队列尾部的指针
int* pBase;//指向数组的指针
}QUEUE;
二、操作
1.初始化
初始化队列的数组长度、前后端。
void iniQueue(QUEUE* pQ)
{
pQ->pBase = (int*)malloc(sizeof(int) * 6);
pQ->front = 0;
pQ->rear = 0;
}
2.判断队列是否已满
bool isFull(QUEUE* pQ)
{
if ((pQ->rear + 1) % 6 == pQ->front)
return true;
else
{
return false;
}
}
3.入队
bool add(int val,QUEUE * pQ)
{
if (isFull(pQ))
{
return false;
}
else
{
pQ->pBase[pQ->rear] = val;
pQ->rear=(pQ->rear+1)%6;
return true;
}
}
4.判断队列是否为空
bool emput_queue(QUEUE* pQ)
{
if (pQ->front == pQ->rear)
{
return true;
}
else
{
return false;
}
}
5.出队
bool out_queue(QUEUE *pQ,int* val)
{
if (emput_queue(pQ))
{
return false;
}
else
{
*val = pQ->pBase[pQ->front];
pQ->front = (pQ->front + 1) % 6;
return true;
}
}
6.遍历队列
void traverse_queue(QUEUE* pQ)
{
int i = pQ->front;
while (i!=pQ->rear)
{
printf("%d
",pQ->pBase[i]);
i = (i + 1) % 6;
}
}
