約瑟夫環是經典算法題:n人圍圈,從1開始報數,數到k者出列,循環至無人。本文提供基於循環隊列的C語言實現,並深度剖析常見邏輯錯誤。
#include <stdio.h>
#define MAX 100
typedef struct {
int data[MAX];
int front, rear;
} CirQueue;
void InitQueue(CirQueue *Q) { Q->front = Q->rear = 0; }
int IsEmpty(CirQueue *Q) { return Q->front == Q->rear; }
int IsFull(CirQueue *Q) { return (Q->rear + 1) % MAX == Q->front; }
void EnQueue(CirQueue *Q, int x) {
if (IsFull(Q)) return;
Q->data[Q->rear] = x;
Q->rear = (Q->rear + 1) % MAX;
}
int DeQueue(CirQueue *Q) {
if (IsEmpty(Q)) return -1;
int x = Q->data[Q->front];
Q->front = (Q->front + 1) % MAX;
return x;
}
void Josephus(int n, int k) {
CirQueue Q; InitQueue(&Q);
for (int i = 1; i <= n; i++) EnQueue(&Q, i);
int count = 0;
while (!IsEmpty(&Q)) {
int person = DeQueue(&Q);
count++;
if (count == k) {
printf("%d ", person); // 出列
count = 0;
} else {
EnQueue(&Q, person); // 繼續報數
}
}
}
int main() {
Josephus(10, 3); // 測試樣例
return 0;
}
掌握約瑟夫環不僅是刷題,更能鍛煉循環數據結構邏輯與邊界條件處理能力。