Java手写队列和案例拓展

Java手写队列和案例拓展

思维导图解释实现思路原理

队列
添加元素
删除元素
获取队首元素
获取队列长度

队列是一种常见的数据结构,遵循先进先出(FIFO)的原则。在Java中,我们可以手动实现一个队列,以便更好地理解其原理和实现。

概念回顾

队列是一种先进先出(FIFO)的数据结构,类似于现实生活中排队的场景。队列有两个基本操作:入队和出队。入队将元素添加到队列的末尾,出队将队列的第一个元素移除并返回。队列还可以通过peek方法获取队首元素,通过size方法获取队列长度,通过isEmpty方法判断队列是否为空。通过手写队列的实现,我们更好地理解了队列的原理和实现方式。队列在实际开发中有着广泛的应用,例如任务调度、消息队列等场景。

实现的详细介绍和详细步骤

步骤一:创建队列类

首先,我们需要创建一个队列类,包含添加元素、删除元素、获取队首元素和获取队列长度的方法。

public class MyQueue<T> {
    private List<T> queue;

    public MyQueue() {
        queue = new ArrayList<>();
    }

    public void enqueue(T item) {
        queue.add(item);
    }

    public T dequeue() {
        if (isEmpty()) {
            throw new NoSuchElementException("队列为空");
        }
        return queue.remove(0);
    }

    public T peek() {
        if (isEmpty()) {
            throw new NoSuchElementException("队列为空");
        }
        return queue.get(0);
    }

    public int size() {
        return queue.size();
    }

    public boolean isEmpty() {
        return queue.isEmpty();
    }
}

步骤二:添加元素

添加元素的方法为enqueue,将元素添加到队列的末尾。

public void enqueue(T item) {
    queue.add(item);
}

步骤三:删除元素

删除元素的方法为dequeue,将队列的第一个元素移除并返回。

public T dequeue() {
    if (isEmpty()) {
        throw new NoSuchElementException("队列为空");
    }
    return queue.remove(0);
}

步骤四:获取队首元素

获取队首元素的方法为peek,返回队列的第一个元素。

public T peek() {
    if (isEmpty()) {
        throw new NoSuchElementException("队列为空");
    }
    return queue.get(0);
}

步骤五:获取队列长度

获取队列长度的方法为size,返回队列中元素的个数。

public int size() {
    return queue.size();
}

步骤六:判断队列是否为空

判断队列是否为空的方法为isEmpty,返回一个布尔值。

public boolean isEmpty() {
    return queue.isEmpty();
}

总结

通过手写队列的实现,我们更好地理解了队列的原理和实现方式。队列在实际开发中有着广泛的应用,例如任务调度、消息队列等场景。掌握队列的基本操作对于提高编程能力和解决实际问题非常有帮助。

拓展案例:实现一个基于队列的热门电影排行榜

假设我们需要实现一个热门电影排行榜,使用队列来存储电影信息,并按照热度进行排序。以下是实现步骤的文字描述和代码示例。

步骤一:创建电影类

首先,我们需要创建一个电影类,包含电影名称和热度两个属性。

public class Movie {
    private String name;
    private int popularity;

    public Movie(String name, int popularity) {
        this.name = name;
        this.popularity = popularity;
    }

    public String getName() {
        return name;
    }

    public int getPopularity() {
        return popularity;
    }
}

步骤二:创建电影排行榜类

创建一个电影排行榜类,使用队列来存储电影信息,并实现按照热度进行排序的方法。

public class MovieRanking {
    private MyQueue<Movie> movieQueue;

    public MovieRanking() {
        movieQueue = new MyQueue<>();
    }

    public void addMovie(Movie movie) {
        movieQueue.enqueue(movie);
    }

    public Movie getTopMovie() {
        if (movieQueue.isEmpty()) {
            throw new NoSuchElementException("电影排行榜为空");
        }
        Movie topMovie = movieQueue.peek();
        MyQueue<Movie> tempQueue = new MyQueue<>();

        while (!movieQueue.isEmpty()) {
            Movie movie = movieQueue.dequeue();
            if (movie.getPopularity() > topMovie.getPopularity()) {
                topMovie = movie;
            }
            tempQueue.enqueue(movie);
        }

        while (!tempQueue.isEmpty()) {
            movieQueue.enqueue(tempQueue.dequeue());
        }

        return topMovie;
    }
}

步骤三:测试代码

public class Main {
    public static void main(String[] args) {
        MovieRanking ranking = new MovieRanking();

        ranking.addMovie(new Movie("Movie A", 100));
        ranking.addMovie(new Movie("Movie B", 200));
        ranking.addMovie(new Movie("Movie C", 150));
        ranking.addMovie(new Movie("Movie D", 300));

        Movie topMovie = ranking.getTopMovie();
        System.out.println("热门电影:" + topMovie.getName());
    }
}

运行结果:

热门电影:Movie D

通过以上案例,我们实现了一个基于队列的热门电影排行榜。每次获取热门电影时,我们会遍历整个队列,找到热度最高的电影,并将队列恢复原样。这样,我们可以不断更新排行榜,并获取当前热门的电影。

你可能感兴趣的:(Java手写源码合集,java,开发语言)