数三退一(利用java数组和对象解决问题)(转)

假设500个小孩手拉着手围着一圈,数三就退出圈子,最后留在圈内的小孩是第几号?

有一种是用很传统的算法,用数组来编。
程序代码如下:

public class CountThreeDel1 {
    public static void main(String args[]) {
       boolean[] arr = new boolean[500];
        for(int i=0;i<arr.length;i++){
           arr[i] = true;
        }
  
       int leftCount = arr.length;
       int countMum = 0;
       int index = 0;
  
       while(leftCount>1) {
           if(arr[index]==true) {
              countMum ++;
              if(countMum == 3) {
                  countMum = 0;
                  arr[index] = false;
                 leftCount --;
               }
            }
   
           index ++;
   
           if(index==arr.length) {
                 index = 0;
           }
       }
  
     for(int i=0;i<arr.length;i++) {
          if(arr[i]==true) {
              System.out.println(i);
               int d = i + 1;
              System.out.println("所以剩下的是第" + d + "号!");
          }
      }
    }
}


采用面向对象的思路:
面向对象的思路,首先考虑这个问题域中有那些类,类里面有哪些属性,哪些方法
题中有一个小孩和由一个小孩围成的圈。
程序代码如下:

public class CountThreeDel2 {
      public static void main(String[] args) {
              KidCircle kc = new KidCircle(500);
               int countNum = 0;
              Kid k = kc.first;
              while(kc.count > 1) {
                   countNum ++;
                   if(countNum == 3){
                         countNum = 0;
                           kc.delet(k);  
                    }
                    k = k.right;
               }
               System.out.print("剩下的小孩编号是:");
               System.out.println(kc.first.id+1);
       } 
}
class Kid {
      int id;
      Kid left;
      Kid right;
}
class KidCircle{
       int count = 0;
       Kid first;
       Kid last;

        KidCircle(int n ) {
             for(int i=0;i<n;i++) {
                    add();  
             } 
        }

        void add() {
              Kid k = new Kid();
             k.id = count;
              if(count <= 0) {
                    first = k;
                    last = k;
                    k.left = k;
                    k.right = k;
              } 
              else {
                      last.right = k;
                       k.left = last;
                      k.right = first;
                      first.left = k;
                      last = k; 
              }
              count ++;  
        }

        void delet(Kid k) {
              if(count <= 0) {
                   return;
              }
              else if(count == 1) {
                        first = last = null;
              }
              else {
                       k.left.right = k.right;
                       k.right.left = k.left;
   
                       if (k == first) {
                              first = k.right; 
                       }
                       else if(k ==last) {
                              last = k.left;
                       }
               }
              count --;
        }
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 循环队列是一种特殊的队列,它采用了循环数组的方式来实现队列的操作。在串口通信中,使用循环队列可以有效地解决串口信息收发的问题。 首先,我们需要使用Java提供的串口通信库,如RXTX或JSerialComm,来创建串口对象,并设置好串口的相关参数,如波特率、数据位、校验位和停止位等。 然后,我们可以使用循环队列来实现串口信息的收发。循环队列有两个指针,一个指向队头,一个指向队尾,分别称为front和rear。我们可以将接收到的串口数据存放在队列中,并通过循环队列的rear指针来指示最后一个数据的位置。 当有新的串口数据到达时,我们将其添加到队列中,并将rear指针后移一个位置。如果rear指针已经到达队列的最大容量,则将其重置为0,实现循环的效果。 同时,我们可以使用一个线程不断地检测队列中是否有数据需要发送。当有数据需要发送时,我们将其从队列中取出,并通过串口对象将数据发送出去。 在接收端,我们可以使用另一个线程来不断地监听串口,当接收到数据时,将其添加到队列中,并将front指针后移一个位置。如果front指针已经到达队列的最大容量,则将其重置为0,实现循环的效果。 通过循环队列的方式,我们可以实现串口信息的收发,并保证数据的顺序和完整性。同时,循环队列还可以避免数据的溢出和浪费,提高了串口通信的效率和稳定性。 因此,利用循环队列可以很好地解决串口信息收发的问题。 ### 回答2: 串口通信是指通过串行通信接口与外部设备进行数据交换的过程。在Java中,可以使用循环队列来解决串口信息收发问题。 循环队列是一种环形数据结构,它可以实现数据的连续存储和高效读写操作。对于串口通信来说,循环队列可以实现接收数据的缓存和发送数据的队列。 在串口信息接收方面,循环队列可以起到缓存的作用。当接收到串口数据时,可以将数据存入循环队列中,然后从队列中读取数据进行后续处理。这样可以有效地解决数据丢失和数据处理速度不匹配的问题。 在串口信息发送方面,循环队列可以起到队列的作用。将要发送的数据存入循环队列中,然后从队列中读取数据发送到串口。这样可以实现将发送数据按顺序发送,并且可以通过设置队列长度来控制发送速度,避免数据丢失和发送速度过快导致的问题。 在Java中,可以使用队列接口和相应的实现类来实现循环队列。可以使用ArrayDeque类实现基于数组的循环队列,也可以使用LinkedList类实现基于链表的循环队列。在使用循环队列时,需要注意队列长度的设置、队列是否为空或满的判断,并且需要实现读写指针的更新。 总之,通过Java中的循环队列,可以很好地解决串口信息收发问题。循环队列可以实现串口数据的缓存和队列管理,保证数据的稳定传输和顺序处理。而且,在Java中使用循环队列也比较简单,只需使用相应的队列接口和实现类,结合合适的判断和更新操作即可。 ### 回答3: java利用循环队列可以较好地解决串口信息收发问题。串口通信是一种特殊的通信方式,需要通过串口接收和发送数据。由于串口数据的不可预测性,我们无法确定何时能收到完整的数据包,因此需要一个缓冲区来存储接收到的数据。 循环队列是一种能够循环利用缓冲区空间的数据结构,它可以提高数据的利用率。在Java语言中,我们可以利用数组来实现循环队列。 首先,我们需要定义一个循环队列的数据结构,包括队列的大小和相关操作方法。其中,包括入队操作和出队操作。入队操作将接收到的串口数据存储到队列中,而出队操作将从队列中取出数据用于处理。 其次,我们需要在程序中创建一个串口监听器,用于监听串口数据的到来。一旦接收到串口数据,监听器将把数据存储到循环队列中。 接着,我们可以创建一个线程来处理循环队列中的数据。线程将不断从队列中取出数据,并进行相应的处理,如数据解析、数据处理、数据存储等等。 使用循环队列的好处是可以提高数据处理的效率和准确性。当数据快速到来时,循环队列可以迅速处理数据并释放空间,然后继续接收新的数据。而如果使用传统的队列结构,可能会导致队列溢出或者数据丢失的情况。 总结起来,在Java利用循环队列解决串口信息收发问题,我们首先需要定义一个循环队列的数据结构,然后创建串口监听器来接收数据并存储到队列中,最后创建一个线程来处理队列中的数据。这样可以提高串口数据的处理效率和准确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值