基本队列
注意,队头不储存内容,只是用于标记,用来判断队是否为空。队伍满的条件是tail指针已经到了maxn-1
#include<iostream>
using namespace std;
const int maxn = 1000;
int q[maxn];
int head = 0, tail = 0;
void push(int v)
{
if (tail == maxn - 1)
{
printf("队满了\n");
return;
}
else
{
q[++tail] = v;
}
}
int pop(void)
{
if (tail == head)
{
printf("队空\n");
return -1;
}
else
{
return q[++head];
}
}
void show(void)
{
for (int i = head + 1; i <= tail; i++)
{
printf("%d ", q[i]);
}
printf("\n");
}
int main(void)
{
for (int i = 1; i <= 10; i++)
{
push(i);
}
show();
pop();
pop();
pop();
show();
return 0;
}
循环队列
由于头指针是不断移动的,当tail指针到达maxn-1时,如果还想添加元素,将会导致
上溢,但实际上数组还有许多空间尚未被利用(0-head)这段区间。我们可以将队列设置为循环的,当tail指针加一时如果会等于maxn,我们将tail指针设置为0,也就是
进行tail=(tail+1)%maxn的操作。但是判断队满的条件要做出改变,不再是tail==maxn-1,而是判断(tail+1)%maxn是否等于head。
#include<iostream>
using namespace std;
const int maxn = 5;
int q[maxn];
int head = 0, tail = 0;
void push(int v)
{
if ((tail+1)%maxn==head)
{
printf("队满了\n");
return;
}
else
{
q[(tail + 1) % maxn] = v;
tail = (tail + 1) % maxn;
}
}
int pop(void)
{
if (tail == head)
{
printf("队空\n");
return -1;
}
else
{
head = (head + 1) % maxn;
return q[head];
}
}
void show(void)
{
int s = head+1;
while (s% maxn != head)
{
printf("%d ", q[s]);
s = (s + 1) % maxn;
}
printf("\n");
}
int main(void)
{
push(5);
push(6);
push(7);
push(8);
pop();
pop();
push(9);
push(10);
show();
return 0;
}