约瑟夫环,一群人坐在一圈,从1开始报数,数到比如4,4号离队,然后接着的5号从1开始报数,再数到4 的离队,直至队列为空。问出队顺序。
我们建立的一维数组,跟现实中的环状队列时不一样的,问题在于数到队尾最后一个人时怎么让他回到队首继续接着数下去。这里引入了求模数或者称为求余数的方法,求关于队列长度的模数,就回到队首了。实现了环状队列。表,栈,队列层面的那个意思的队列也是这么实现下标在队列数组里循环的。
#include<iostream>
using namespace std;
void josephRing(int array[],int dequeueOrder,int arrayLength) {
for (int i = 0; i < arrayLength; i++)
cout << array[i] << " ";
cout << endl;
for (int i = 0 ; arrayLength >= 1; arrayLength--) {
i = (i + dequeueOrder - 1) % arrayLength;
cout << array[i] << " ";
for (int j = i; j < arrayLength - 1; j++)
array[j] = array[j + 1];
}
cout << endl;
}
int main() {
int array[] = { 1,2,3,4,5,6,7,8 };
int dequeueNumber = 4;
int arrayLength = 8;
josephRing(array,dequeueNumber,8);
return 0;
}
结果和课本里是一样的。但变量名见名知意,更好理解。谢谢