面试题45—圆圈中最后剩下的数字

时间:2021-07-03 14:16:29

**题目:约瑟夫环问题
代码示例:**

#include<iostream>
using namespace std;
const int MaxSize = 100;
class MyQueue
{
int data[MaxSize];
int front;
int rear;
public:
MyQueue(){ front = 0; rear = 0; }
~MyQueue(){}
bool Empty(void);
bool Push(int e);
bool Pop(int &e);

void CreateQueue(int n);
void DeleteMthCircle(int m);
};
bool MyQueue::Empty(void)
{
return (front == rear);
}
bool MyQueue::Push(int e)
{
rear = (rear + 1) % MaxSize;
if (rear != front)
{
data[rear] = e;
return true;
}
else
return false;
}
bool MyQueue::Pop(int &e)
{
if (front == rear)
return false;

front = (front + 1) % MaxSize;
e = data[front];
return true;
}

void MyQueue::CreateQueue(int n)
{
if (n >= MaxSize)
return;
cout << "队列中的元素:";
for (int i = 0; i < n; i++)
{
rear++;
data[rear] = i;
cout << i << " ";
}
cout << endl;
}
void MyQueue::DeleteMthCircle(int m)
{
cout << "依次删除循环队列中的第"<<m<<"个元素:";
int length = (rear - front + MaxSize) % MaxSize;
while (length != 1)
{
int e;
for (int i = 0; i < m - 1; i++)
{
Pop(e);
Push(e);
}
Pop(e);
cout << e << " ";
length = (rear - front + MaxSize) % MaxSize;
}
cout << endl;

cout << "剩下的最后一个元素为:" << data[rear] << endl;
}
int main()
{
MyQueue myqueue;
int n = 5;
int m = 3;
myqueue.CreateQueue(n);
myqueue.DeleteMthCircle(m);
return 0;
}