1、定义
一种可以实现“先进先出”的存储结构,(不允许中间插入,只能从一端添加或者删除元素)类似于排队买票,不允许插队的情况下先排队的人先买票。)。
2、队列分类
(1)链式队列(由链表实现)
(2)静态队列(由数组实现)
静态队列通常必须是循环队列;
循环队列:
1、静态队列为什么必须是循环队列
每次入队或者出队都是font或者rear向后移动一位,font指针无法往前移动,此时就会造成删除的空间无法使用!
2、循环队列需要几个参数来确定
<1> front参数
<2> rear参数
3、循环队列各个参数的含义
1) 队列初始化
front和rear的值都是0;
2)队列非空
front代表的是队列的第一个元素;
rear代表的是队列的最后一个有效元素
3)队列空
front和rear的值相等,但是不一定为0
4、循环队列入队伪算法
<1>将值存入f 所代表的位置,r向后移动;
<2>错误的写法(r = r+1);正确的写法:r = (r+1)%数组的长度
5、循环队列出队伪算法
<1> f = (f+1)%数组的长度
6、如何判断循环队列是否为空
如果front与rear的值相等,则该队列一定为空
7、如何判断循环队列是否已满
front的值与rear的值大小不确定,也有可能相等;
两种方法:
<1>增加一个标识参数
<2>少用一个元素(通常使用这种方式)
如果f和r 的值相邻,则队列已满:(C语言伪算法如下)
if((r+1)%数组长度 == f)
{
已满
}
else
{
不满
}
队列的操作实现(C语言)
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include <stdbool.h>
typedef struct Queue
{
int * pBase;
int front;
int rear;
}QUEUE;
void init(QUEUE *);
bool en_queue(QUEUE * ,int val);
void traverse_queue(QUEUE *);
bool full_queue(QUEUE *);
bool out_queue(QUEUE *,int * pVal);
bool empty_queue(QUEUE *);
int main(void)
{
int val;
QUEUE Q;
init(&Q);
/* en_queue(&Q,1);
en_queue(&Q,2);
en_queue(&Q,3);
en_queue(&Q,4);
en_queue(&Q,5);
en_queue(&Q,6);
en_queue(&Q,7);
*/
traverse_queue(&Q);
if(out_queue(&Q,&val))
{
printf("出队成功,出队的元素是:%d\n",val);
}
else
{
printf("出队失败\n");
}
traverse_queue(&Q);
return 0;
}
//队列初始化
void init(QUEUE *pQ)
{
pQ->pBase = (int *)malloc(sizeof(int)*6);
pQ->front = 0;
pQ->rear = 0;
}
//向队列中放入数据
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;
}
}
//判断队列是否已满
bool full_queue(QUEUE *pQ)
{
if((pQ->rear+1)%6 == pQ->front)
{
return true;
}
else
{
return false;
}
}
//遍历队列
void traverse_queue(QUEUE *pQ)
{
int i = pQ->front;
if(empty_queue(pQ))
{
printf("该队列为空\n");
}
else
{
while (i!=pQ->rear)
{
printf("%d ",pQ->pBase[i]);
i = (i+1)%6;
}
printf("\n");
}
return ;
}
//判断队列是否为空
bool empty_queue(QUEUE *pQ)
{
if(pQ->front == pQ->rear)
{
return true;
}
else
{
return false;
}
}
//出队
bool out_queue(QUEUE *pQ,int * pVal)
{
if(empty_queue(pQ))
{
return false;
}
else
{
*pVal = pQ->pBase[pQ->front];
pQ->front = (pQ->front+1)%6;
return true;
}
}
**队列的应用:**所有和时间有关的操作都有队列的应用。