1、 有500个小朋友拉成一个圆圈,从其中一个小朋友开始依次编号1-500,从1号小朋友开始循环1-3报数,数到3的小朋友就退出。编写一个Java应用程序,计算出最后一个小朋友的号码是多少?(20分)
这题可用一个简单的循环队列来模拟,但队列中剩余一个元素时就为我们的所要求的。
class DNode<T>{
T value;
DNode<T> next;
DNode<T> pre;
public DNode() {
value = null;
next = this;
pre = this;
}
public DNode(T value){
this.value = value;
}
}
class DList<T>{
DNode<T> header;
DNode<T> curr;
int size;
public DList(){
header = null;
curr = header;
size = 0;
}
public void add(T item){
if(header == null){
header = new DNode<T>(item);
curr = header;
}else{
curr.next = new DNode<T>(item);
curr.next.pre = curr;
curr = curr.next;
curr.next = header;
header.pre = curr;
}
size++;
}
public void remover(DNode<T> node){
node.pre.next = node.next;
node.next.pre = node.pre;
//System.out.println(node.value + "出队");
node = null;
size --;
}
public int size(){
return size;
}
public T value(){
return curr.value;
}
public DNode<T> next(){
DNode<T> returnDNode = curr;
curr = curr.next;
return returnDNode;
}
}
public class Game{
DList<Integer> children;
public Game(int n){
children = new DList<Integer>();
for(int i = 1; i <= n; i++){
children.add(i);
}
}
public int start(int step){
int stepNums = 0;
DNode<Integer> node = children.header;
while(true){
if(children.size() == 1){
break;
}
if(++stepNums == step){
children.remover(node);
stepNums = 0;
}
node = node.next;
}
return node.value;
}
public static void main(String[] args) {
Game game = new Game(10);
System.out.println("最后留下:" + game.start(3));
}
}
分享到:
相关推荐
循环队列是一种线性数据结构,它在物理结构上实现了一个首尾相接的闭合序列,从而解决了普通队列在满和空时的操作限制。循环队列的主要优点是消除了队头和队尾的特殊状态,使得在处理数据时效率更高。下面将详细介绍...
约瑟夫环问题是一个经典的计算机科学问题,涉及在一个循环队列中按照特定规则移除元素。在这个实验中,通过循环队列模拟约瑟夫环问题,实现并输出特定条件下的出列序列。 1. **初始化队列**:根据给定的人数`n`,将...
本篇将基于题目提供的部分代码,深入探讨如何使用C语言实现一个仅有尾指针的循环队列。 #### 循环队列基础概念 循环队列是队列的一种特殊形式,通过利用数组的循环特性,解决了传统队列(基于数组实现)中可能出现...
该代码可在VC6.0平台直接编译运行,经...用数组实现了循环队列的操作,包括入队,出队,队列是否为空,队列是否为满,以及队列的遍历输出功能,各个子函数有详细的说明……希望对正在学习数据结构的同志有所帮组……
郭艳数据结构作业之循环队列的应用与斐波拉契。题目如下: 在K_Fib.h文件中K_Fib()函数实现计算并输出K阶斐波那契序列(f0,f1,…,fn),其中该序列最大项fn小于或等于max,而第n+1项大于max。算法要求仅采用空间...
向循环链队插入一个元素值为x的节点 #### 插入算法思路: - 首先创建一个新节点,并将数据域赋值为x。 - 然后让新节点的next指针指向队尾节点的next。 - 更新队尾节点的next指针指向新节点。 - 最后更新队尾指针...
初始化队列是创建一个空的链队列,通常会定义一个结构体来表示队列节点,并设置头节点和尾节点。在C语言中,可以这样定义: ```c typedef struct Node { int data; // 数据域,用于存储元素 struct Node* next; /...
循环队列是一种特殊的队列,它在物理存储上是一个有限的序列,但通过巧妙的索引操作,使得队列在逻辑上看起来像是无限延伸的。循环队列的插入操作是其核心功能之一,这里我们将详细探讨这个过程。 首先,我们需要...
1.实验目的: 熟悉队列的定义,队列的特点以及队列的基本操作。能够根据实际情况选择合适的存储结构,...3、从屏幕输出每一轮舞伴配对名单,如果在该轮有未配对的,能够从屏幕显示下一轮第一个出场的未配对者的姓名。
对于题目中提到的**DSDemoW.EXE**文件,这可能是一个可执行程序,用于演示链式栈和循环队列的操作过程。运行这个程序,你可能会看到动态的插入和删除数据的过程,以及输出的结果。它可以帮助直观地理解这两种数据...
在实验报告中,学生可以选择不同的题目进行实践,比如实现顺序栈和链式栈,链队列和循环队列,或者使用栈解决实际问题,如3阶汉诺塔问题。每个题目都要求编写程序,进行调试和运行,并通过实验报告展示程序的正确性...
循环队列是另一种队列实现方式,它利用数组将队列的末尾和开头连接起来,形成一个环状结构。这种结构使得队列在满时无需额外的空间就能进行入队操作,只需将队尾指针移动到队头,形成一种“循环”的效果。循环队列的...
- 采用队头/队尾间隔至少一个空闲元素的方法实现循环队列,这样可以避免队列的物理连续性与逻辑连续性的混淆,同时便于检测队列是否为空或满。 - 当队列为满时尝试执行入队操作,或者队列为时空执行出队操作时,...
实验题目:循环队列的分解 实验内容及要求: 从控制台屏幕循环提供如下菜单: 1. 元素入队 2. 元素出队 3. 显示当前队列元素 4. 分解队列 5. 退出程序 元素入队:输入一个整数,元素入队,队满应提示无法入队; 元素...
在题目描述中提到的条件"fn ≤max而fn+1 >max"是一个终止条件,意味着当当前的斐波那契数fn不超过某个最大值max时,程序将继续计算,直到下一个数fn+1超过这个值为止。这可以帮助我们控制计算范围,防止无限制地生成...
- 这道题目的目标是设计一个高效的循环队列类,包括`enqueue`、`dequeue`、`front`(返回队首元素但不移除)、`rear`(返回队尾元素的下一个位置)以及`isEmpty`(检查队列是否为空)等方法。 - 解题的关键在于...
单循环链表是一种特殊的链表,它的最后一个节点指向第一个节点,形成一个环状结构,这使得在链表中的遍历更为方便。 首先,我们需要创建一个节点类(Node)来表示链表中的每个元素,包含两个属性:value(存储士兵的...
- 在给定的题目中,选项A表明如果p1=n,那么pi的值是n-i+1,这是因为栈遵循LIFO原则,所以最后一个入栈的元素第一个出栈,倒数第二个入栈的元素第二个出栈,以此类推。 2. 队列(Queue): - 队列是一种“先进先...