九、队列
1.定义
一种可以实现”先进先出”的存储结构
2.分类
链式队列 – 用链表实现
静态队列 –用数组实现
静态队列通常都必须是循环队列
循环队列的理解:
- 静态队列为什么必须是循环队列
传统的数组会使下面这部分内存无法使用!
所以必须是一个循环队列才行
- 循环队列需要几个参数来确定
需要2个参数来确定
front
rear
- 循环队列各个参数的含义
2个参数不同场合有不同的含义
1)队列初始化
front和rear的值都是零
2)队列非空
front代表的是队列的第一个元素
rear代表的是队列的最后一个有效元素的下一个元素
3)队列空
front和rear的值相等,但不一定是零
- 循环队里入队伪算法讲解
1)将值存入r所代表的位置
2)错误的写法r=r+1
正确的写法是:r=(r+1)%数组的长度
- 循环队列出队伪算法讲解
f=(f+1)%数组长度
- 如何判断循环队列是否为空
如果 front 与 rear 的值相等,
则该队列就一定为空
- 如何判断循环队列是否已满
两种方式:
多增加一个标识参数
少用一个元素(常用)
若果r和f的值紧挨着,则队列已满
if((r+1)%数组长度 == f)
已满
else
不满
3.算法演示
队列的结构和所需的方法
typedef struct Queue
{
int * pBase;
int front;
int rear;
}QUEUE;
void init(QUEUE *);
bool en_queue(QUEUE *, int);
bool full_queue(QUEUE *);
bool empty_queue(QUEUE *);
void traverse_queue(QUEUE *);
bool out_queue(QUEUE *, int *);
init方法
void init(QUEUE *pQ)
{
pQ->pBase = (int *)malloc(sizeof(int) * 6);//创建一个数组
pQ->front = 0;
pQ->rear = 0;
}
en_queue方法
bool en_queue(QUEUE * pQ, int val)
{
if (full_queue(pQ))
{
return false;
}
else
{
pQ->pBase[pQ->rear] = val;
pQ->rear = (pQ->rear + 1) % 6;
return true;
}
}
full_queue方法
bool full_queue(QUEUE * pQ)
{
//当rear到了5号元素时,判断为满,因此5号元素无法被赋值
if ((pQ->rear + 1) % 6 == pQ->front)
return true;
else
return false;
}
empty_queue方法
bool empty_queue(QUEUE * pQ)
{
if (pQ->rear == pQ->front)
return true;
else
return false;
}
traverse_queue方法
void traverse_queue(QUEUE * pQ)
{
if (empty_queue(pQ))
{
return;
}
int i = pQ->front;
while (i != pQ->rear)
{
printf(“%d”, pQ->pBase[i]);
i = (i + 1) % 6;
}
printf(“n”);
return;
}
out_queue方法
bool out_queue(QUEUE * pQ, int * pVal)
{
if (empty_queue(pQ))
return false;
*pVal = pQ->pBase[pQ->front];
pQ->front = (pQ->front + 1) % 6;
return true;
}
4.具体应用
所有和时间有关的操作都与队列有关
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!