Java 模拟队列(一般队列、双端队列、优先级队列)[通俗易懂]

Java 模拟队列(一般队列、双端队列、优先级队列)

大家好,又见面了,我是全栈君。

队列:

先进先出,处理类似排队的问题,先排的。先处理,后排的等前面的处理完了,再处理

对于插入和移除操作的时间复杂度都为O(1)。从后面插入,从前面移除

双端队列:

即在队列两端都能够insert和remove:insertLeft、insertRight。removeLeft、removeRight

含有栈和队列的功能,如去掉insertLeft、removeLeft,那就跟栈一样了。如去掉insertLeft、removeRight。那就跟队列一样了

一般使用频率较低,时间复杂度 O(1)

优先级队列:

内部维护一个按优先级排序的序列。插入时须要比較查找插入的位置,时间复杂度O(N), 删除O(1)

/* * 队列	先进先出。一个指针指示插入的位置,一个指针指示取出数据项的位置 */public class QueueQ<T> {	private int max;	private T[] ary;	private int front; //队头指针  指示取出数据项的位置	private int rear;  //队尾指针  指示插入的位置	private int nItems; //实际数据项个数		public QueueQ(int size) {		this.max = size;		ary = (T[]) new Object[max];		front = 0;		rear = -1;		nItems = 0;	}	//插入队尾	public void insert(T t) {		if (rear == max - 1) {//已到实际队尾,从头開始			rear = -1;		}		ary[++rear] = t;		nItems++;	}	//移除队头	public T remove() {		T temp = ary[front++];		if (front == max) {//列队到尾了,从头開始			front = 0;		}		nItems--;		return temp;	}	//查看队头	public T peek() {		return ary[front];	}		public boolean isEmpty() {		return nItems == 0;	}		public boolean isFull() {		return nItems == max;	}		public int size() {		return nItems;	}		public static void main(String[] args) {		QueueQ<Integer> queue = new QueueQ<Integer>(3);		for (int i = 0; i < 5; i++) {			queue.insert(i);			System.out.println("size:" + queue.size());		}		for (int i = 0; i < 5; i++) {			Integer peek = queue.peek();			System.out.println("peek:" + peek);			System.out.println("size:" + queue.size());		}		for (int i = 0; i < 5; i++) {			Integer remove = queue.remove();			System.out.println("remove:" + remove);			System.out.println("size:" + queue.size());		}				System.out.println("----");				for (int i = 5; i > 0; i--) {			queue.insert(i);			System.out.println("size:" + queue.size());		}		for (int i = 5; i > 0; i--) {			Integer peek = queue.peek();			System.out.println("peek:" + peek);			System.out.println("size:" + queue.size());		}		for (int i = 5; i > 0; i--) {			Integer remove = queue.remove();			System.out.println("remove:" + remove);			System.out.println("size:" + queue.size());		}	}	}

/*
 * 双端队列<span style="white-space:pre">	</span>两端插入、删除
 */
public class QueueQT<T> {
	private LinkedList<T> list;

	public QueueQT() {
		list = new LinkedList<T>();
	}

	// 插入队头
	public void insertLeft(T t) {
		list.addFirst(t);
	}

	// 插入队尾
	public void insertRight(T t) {
		list.addLast(t);
	}

	// 移除队头
	public T removeLeft() {
		return list.removeFirst();
	}

	// 移除队尾
	public T removeRight() {
		return list.removeLast();
	}

	// 查看队头
	public T peekLeft() {
		return list.getFirst();
	}

	// 查看队尾
	public T peekRight() {
		return list.getLast();
	}

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

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

}
/*
 * 优先级队列	队列中按优先级排序。是一个有序的队列
 */
public class QueueQP {
	private int max;
	private int[] ary;
	private int nItems; //实际数据项个数
	
	public QueueQP(int size) {
		this.max = size;
		ary =  new int[max];
		nItems = 0;
	}
	//插入队尾
	public void insert(int t) {
		int j;
		if (nItems == 0) {
			ary[nItems++] = t;
		} else {
			for (j = nItems - 1; j >= 0; j--) {
				if (t > ary[j]) {
					ary[j + 1] = ary[j]; //前一个赋给后一个  小的在后		相当于用了插入排序。给定序列本来就是有序的。所以效率O(N)
				} else {
					break;
				}
			}
			ary[j + 1] = t;
			nItems++;
		}
		System.out.println(Arrays.toString(ary));
	}
	//移除队头
	public int remove() {
		return ary[--nItems]; //移除优先级小的
	}
	//查看队尾 优先级最低的
	public int peekMin() {
		return ary[nItems - 1];
	}
	
	public boolean isEmpty() {
		return nItems == 0;
	}
	
	public boolean isFull() {
		return nItems == max;
	}
	
	public int size() {
		return nItems;
	}
	
	public static void main(String[] args) {
		QueueQP queue = new QueueQP(3);
		queue.insert(1);
		queue.insert(2);
		queue.insert(3);
		int remove = queue.remove();
		System.out.println("remove:" + remove);
		
	}
	
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116477.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • CryptoJS简单使用

    CryptoJS简单使用转自CryptoJS简单使用CryptoJS简单使用.简单看下几种加密和哈希函数.

    2025年7月22日
    4
  • DM368开发 — 视频监控系统相关技术研究(转毕设)[通俗易懂]

    DM368开发 — 视频监控系统相关技术研究(转毕设)[通俗易懂]基于DM368的高清视频监控系统设计与实现–文波

    2022年8月13日
    9
  • 决策树CART算法、基尼系数的计算方法和含义[通俗易懂]

    决策树CART算法、基尼系数的计算方法和含义[通俗易懂]决策树CART算法——基尼系数决策树的CART算法使用基尼系数来选择划分属性。一个数据集的纯度可以用基尼系数来度量Gini(D)=∑k=1∣y∣∑k′≠kpkpk′=1−∑k=1∣y∣pk2\begin{aligned}Gini(D)=\sum_{k=1}^{|y|}\sum_{k&#x27;\nek}p_kp_{k&#x27;}=1-\sum_{k=1}^{|y|}…

    2022年10月13日
    6
  • linux查看运行中的java_linux怎么查看当前进程

    linux查看运行中的java_linux怎么查看当前进程【www.hyheiban.com–知识文库】在linux系统下可以通过命令查看进程,那么具体是那个命令呢?下面由小编为大家整理了linux查看进程的命令,希望对大家有帮助!一、linux查看进程的命令有ps、pstree、pgrep等1、ps显示进程信息,参数可省略-aux以BSD风格显示进程常用-efH以SystemV风格显示进程-e,-A显示所有进程a显示终端上所有用户的…

    2022年8月24日
    5
  • P2P流媒体(p2p技术是谁发明的)

       上研都快一年啦,在呢年里说来惭愧,还没找好自己真正想研究的领域,我是比较喜欢网络方面的应用开发,但是网络也有好多方向啦,前段时间对搜索很感兴趣,还很冲动想专一下这方面,不过不好的地方是跟导师研究的方向没有大多交集,除非是搞并行算法方面,其它也可以…      前几天无意间看到peercast这个基于P2P的网络收音机,突然间激发了我心情的一团火(就好似酱爆甘,响呢个momen

    2022年4月16日
    65
  • java的前端还是后端_java语言是开发前端还是后端的[通俗易懂]

    java的前端还是后端_java语言是开发前端还是后端的[通俗易懂]java语言是开发前端还是后端的发布时间:2020-06-2616:01:18来源:亿速云阅读:105作者:Leahjava语言是开发前端还是后端的?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。java不是前端,是后端。Java语言是最常见的后端开发语言之一,Java语言由于自身具备构建多线程的能力,且体系结构比较中…

    2022年7月7日
    19

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号