Queue的实现

本文介绍了一种使用链表实现队列的方法,包括基本操作如入队和出队,并提供了一个简单的测试案例来验证队列的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Queue的实现

  队列是一种常用的先进先出结构,就像排队购票,本文实现—初始化队列为null,当第一个元素入队,队头和队尾重叠,以后入队则将队尾向后推,出队则将队头向后推,也可以采用循环队列实现,可以有效利用空间。

功能描述

  入队enqueue和出队dequeue。

代码实现

package com.yam.base;

/**
 * 队列实现(使用链表实现)
 * @author: Ympery
 * @date: 2017/3/15 14:15.
 */
public class MyQueue<AnyType> {

    private Node first; // 队头
    private Node last; // 队尾
    private int theSize; // 队列大小

    /*public MyQueue() {
        theSize = 0;
        last = new Node(null, null);
        first = last;
    }*/

    /**
     * 队列中的节点
     */
    private class Node {
        public Node(Node n, AnyType d) {
            next = n;
            data = d;
        }
        Node next;
        AnyType data;
    }

    public int size() { return theSize; }
    // 也可以使用null == first
    public boolean isEmpty() { return 0 == theSize; }

    /**
     * 入队
     * @param data
     */
    public void enqueue(AnyType data) {
        Node oldLast = last;
        last = new Node(null, data);
        if (isEmpty())  first = last;
        else    oldLast.next = last;
        theSize++;
    }

    /**
     * 出队
     * @return
     */
    public AnyType dequeue() {
        AnyType value = first.data;
        first = first.next;
        if (isEmpty())  last = null;
        theSize--;
        return value;
    }

    /**
     * 测试
     * @param args
     */
    public static void main(String[] args) {

        char c = 'a';
        MyQueue<Character> queue = new MyQueue<>();

        for (int i = 0; i < 15; i++)
            queue.enqueue(c++);

        System.out.println("当前大小:" + queue.size());

        for (;!queue.isEmpty();)
            System.out.print(queue.dequeue() + " ");

        System.out.println("\n当前大小:" + queue.size());
    }
}
### 使用 Queue 实现约瑟夫问题 为了理解如何使用 `Queue` 来解决约瑟夫环问题,可以考虑如下 C# 的实现方式。此方法利用了队列先进先出 (FIFO) 特性来模拟人员出局的过程。 ```csharp using System; using System.Collections.Generic; class JosephusProblem { public static int FindSurvivor(int n, int k) { // 创建一个循环队列 Queue<int> queue = new Queue<int>(); // 初始化队列,加入所有人编号 for (int i = 1; i <= n; ++i) { queue.Enqueue(i); } while(queue.Count > 1){ // 将前k-1个人重新入队 for(int j = 1; j < k; ++j){ queue.Enqueue(queue.Dequeue()); } // 移除第k个人 Console.WriteLine($"移除了 {queue.Dequeue()}"); } return queue.Peek(); // 返回最后一个存活者的编号[^1] } static void Main(string[] args) { int survivorPosition = FindSurvivor(7, 3); // 假设有7个人,每数到第三个就出局 Console.WriteLine($"最终幸存者的位置是: {survivorPosition}"); } } ``` 上述代码片段定义了一个名为 `FindSurvivor` 的静态方法用于计算给定人数 `n` 和计数值 `k` 下的最后一名幸存者的索引位置。程序首先创建并填充一个整型队列表示参与者序列;接着,在每次迭代过程中,它会把前面 `k-1` 名成员再次放入队尾,并删除当前位于前端的人直到剩下唯一一人为止。最后一行调用了这个函数实例化演示效果。 #### 关键点解释: - **初始化**:构建大小为 `n` 的队列并将所有人的序号依次加入其中。 - **核心逻辑**:当队列长度大于一时持续执行以下操作——将前 `k-1` 位元素逐个弹出入栈再压回末端,随后去除下一个被指向的对象作为被淘汰个体。 - **终止条件**:一旦只剩余单个节点,则其保存的就是所寻找的目标值即胜利者的身份标识符。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值