循环队列的一些知识点:
1、初始时front和rear指针都为0
2、队满条件为:
(rear+1)%MaxSize==front
3、队空条件为
rear==front
4、顺序队类型定义如下
typedef struct
{
ElemType data[MaxSize];
int front,rear;
}
问题描述:
n个人站成一排,编号分别为1~n,左往右“1,2,1,2”报数,数到1的人出列并报出自己的编号,数到2的人加入队尾(即数到2的人从队首立即进入队尾,不报自己的编号)。
解决思路:
0、利用循环队列,先进先出,即使先数到2的人被加入了队尾,也会比后数到2的人先报号
1、用1~n这n个数字初始化队列,即先将n个人进队
2、判断队列是否为空,若不为空执行下一步
3、将当前队首的人出列,并报号
4、将当前队首的人出列并加入队尾,不报号
5、返回第2步
#include <iostream>
using namespace std;
typedef struct
{
int data[50];
int front, rear;
}SqQueue;
void number(int n)//报数问题
{
int i, e;
SqQueue q;
q.front = q.rear = 0;
for (i = 1; i <= n; i++)//init queue
{
q.rear = (q.rear + 1) % 50;//队列最长为50
q.data[q.rear] = i;
}
cout << "初始序列为:" << endl;
for (i = 1; i <= n; i++)
{
printf("%d ",q.data[i]);
}
printf("\n ");
cout << "出队顺序为:" << endl;
while (q.front != q.rear)//当队列不空时循环
{
q.front = (q.front + 1) % 50;
e = q.data[q.front];
cout << e << " ";
if (q.front == q.rear)
{
break;
}
else {
q.front = (q.front + 1) % 50;
e = q.data[q.front];
q.rear = (q.rear + 1) % 50;
q.data[q.rear] = e;
}
}
cout << endl;
}
int main()
{
int n = 8;
number(8);
system("pause");
}