说到队列,就经常会想起饭堂的“排队长龙”。
队列,也是一种特殊的被限定的数据结构。
特殊在于队列只能在队头取元素,只能在队尾进元素。
实现队列需要三个元素:
即
①用来存放元素的数组。
②两个指针。其中头指针指向队头元素(下标不一定为0哦),尾指针指向队尾元素+1的那个位置。
队列有两种操作:
①入队操作:
即把元素放到队尾指针所指位置,而后队尾指针往下一个位置移动。(这里为什么不是tail++稍后会讲)
②出队操作:
即取出队头指针所指元素而后队头指针往下一个位置移动。 (这里为什么不是head++稍后会讲)
从外面上述的两种操作,我们很容易想到这种情况:
经过一系列入队出队操作,在队头指针前面,会造成连续的可利用空间,
于是,聪明的前人就说啊,我们可以把队列在逻辑上看成一个环:
这样子,只要还有空间,就可以一直入队,不会造成空间上的浪费;
代码实现起来也很简单,头指针和尾指针在移动到下一个元素的时候,不要直接++,而是+1后取模:
完整代码:
#include<iostream>
using namespace std;
const int maxn=1000;
int a[maxn];
int head;//头指针
int tail;//尾指针
//基本操作1-进队列
void enqueue(int x)
{
a[tail]=x;
tail=(tail+1)%maxn;//而不是tail++
}
//基本操作2-出队列
int dequeue()
{
int x=a[head];
head=(head+1)%maxn;//而不是head++;
return x;
}
int main()
{
//队列:1,2,3,4,5,7,8,9,10
head=tail=0;//初始化队列为空。
for(int i=1; i<=10; i++)
{
enqueue(i);
}
while(head!=tail)
{
cout<<dequeue()<<" ";
}
return 0;
}