您的位置:首页 > 理论基础 > 数据结构算法

数据结构复习——队列解决报数问题

2017-07-03 15:03 225 查看
循环队列的一些知识点:

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");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: