队列
1、定义:一种可以实现先进先出的存储结构都叫队列。即一端入一段出。(在两端操作,而栈是在一段进行操作)
2、分类
链式队列:用链表实现,就是在末尾增加了一个指向尾节点的指针。指向首节点的指针同front表示,不用head
静态队列:用数组实现。静态队列通常都必须是循环队列
循环队列的讲解:
(1)静态队列为什么必须是循环队列
因为当到达末尾时,front和rear都动不了了,只有是循环的才能继续移动。
(2)循环队列需要几个参数来确定:
front(头,删除元素,指向第一个元素)和rear(尾,增加元素,指向最后一个元素的下一个元素)。
(3)循环队列各个参数的涵义
1)队列初始化时:front和rear都是零
2)队列非空时:front指向队列的第一个元素,rear指向最后一个有效元素的下一个元素
3)队列空时:front和rear都指向同一个元素,但此元素不一定是第一个元素。
3、队列伪算法讲解
(1)入队伪算法(两部)
a:将值存如r所指向的位置
b:r=(r+1)%素组的长度
(2)出队伪算法
a:f=f(f+1)%数组的长度
(3)判断循环队列是否为空
如果front与rear的值相等则该队列一定为空。
(4)如何判断循环队列是否已满
假定数组长度为N,规定个数为N-1时就为满,即(r+1)%数组长度=f时队列就为满。
if((r+1)%数组长度==f)
已满
else
不满
4、具体算法实现
(1)队列的结构
`
//定义一个队列的结构
class Queue{
public:
int* arr;
int front;
int rear;
};
`
(2)队列的初始化
`
//初始化一个队列,即f和r都为零,开辟队列大小
int init_queue(Queue* myq)
{
cout<<"输入队列的长度"<<endl;
int a;
cin>>a;
const int len=a;
myq->arr=new int[len];//队列的长度为6,但只能存5个元素
myq->front=0;
myq->rear=0;
return len;
}
`
(3)判断队列是否为满
//判断队列是否满
bool full_queue(Queue* myq,int len)
{
if((myq->rear+1)%len==myq->front)
return true;
else
return false;
}
(4)入队
`
//入队
void in_queue(Queue* myq,int len)
{
if(!full_queue(myq,len))
{
int val;
cout<<"请输入要插入的值:"<<endl;
cin>>val;
myq->arr[myq->rear]=val;
myq->rear=(myq->rear+1)%len;
}
else
cout<<"数组已满"<<endl;
}
`
(5)出队
`
//出队
void out_queue(Queue* myq,int len)
{
int val;//保留出队的值,供返回使用
if(myq->front==myq->rear)//首先判断队列是否为空
cout<<"队列为空,不能出队"<<endl;
else
{
val=myq->arr[myq->front];
myq->front=(myq->front+1)%len;
}
}
`
(6)遍历一个队列
`
//遍历一个队列
void show_queue(Queue* myq,int len)
{
Queue tmp=*myq;//遍历不能改变队列的结构,所以用一个临时遍历遍历 ,不能是指针结构
while(tmp.front!=tmp.rear)
{
cout<<tmp.arr[tmp.front]<<endl;//显示列头的值,队列为空
tmp.front=(tmp.front+1)%len;
}
}
`