数据结构-队列,优先队列

队列是遵循先进先出(First-In-First-Out)模式的线性表。

一般有以下操作:

boolean add(E e);

Inserts the specified element into this queue if it is possible to do so immediately without violating capacity restrictions, returning true upon success and throwing an IllegalStateException if no space is currently available.

boolean offer(E e);

Inserts the specified element into this queue if it is possible to do so immediately without violating capacity restrictions.

E remove();

Retrieves and removes the head of this queue. @throws NoSuchElementException if this queue is empty

E poll();

Retrieves and removes the head of this queue, or returns null if this queue is empty.

E element();

Retrieves, but does not remove, the head of this queue. @throws NoSuchElementException if this queue is empty

E peek();

Retrieves, but does not remove, the head of this queue, or returns  null if this queue is empty.

由于队列对数据的get/set特殊,一般采用链接实现起来比较方便。参照链表就可以实现,这里就不给出具体的代码了。

public class LinkedQueue<E> implements Queue<E> {

}

优先队列是基于优先级处理对象进出操作。优先队列要求使用Comparable和Comparator接口给对象排序,并且在排序时会按照优先级处理其中的元素。PriorityQueue是非线程安全的, PriorityBlockingQueue(实现BlockingQueue接口)用于Java多线程环境。

方法iterator()中提供的迭代器并不保证以有序的方式遍历优先级队列中的元素。

可以在构造函数中指定如何排序。

此实现为插入方法(offer、poll、remove() 和 add 方法)提供 O(log(n)) 时间;

为 remove(Object) 和 contains(Object) 方法提供线性时间;

为检索方法(peek、element 和 size)提供固定时间。

实例

后半部分模拟乘坐高铁的检票到乘坐环节(假设全车座位序号为连续数字)。

public class PriorityQueueModel {

private int id;

private String name;

getter/setter(略)

}

import java.util.Comparator;

import java.util.PriorityQueue;

import java.util.Queue;

import java.util.Random;

public class PriorityQueueExample {

// Comparator

public static Comparator<PriorityQueueModel> idComparator = new Comparator<PriorityQueueModel>() {

@Override

public int compare(PriorityQueueModel c1, PriorityQueueModel c2) {

return (int) (c1.getId() - c2.getId());

}

};

public static void main(String[] args) {

// 优先队列示例

Queue<Integer> seqPriorityQueue = new PriorityQueue<>(7);

Random rand = new Random();

for(int i = 0; i < 7; i++) {

seqPriorityQueue.add(new Integer(rand.nextInt(100)));

}

seqPriorityQueue.add(new Integer(0));

seqPriorityQueue.add(new Integer(-1));

int size = seqPriorityQueue.size(); // note : here

for(int i = 0; i < size; i ++) {

Integer in = seqPriorityQueue.poll(); // poll

System.out.println("SEQ:" + in);

}

System.out.println("size=" + seqPriorityQueue.size() + "\n");

// 优先队列使用示例

Queue<PriorityQueueModel> 动车1 = new PriorityQueue<>(10, idComparator);

Random 票机 = new Random();

for(int i = 0; i < 7; i++) {

int id = 检票机.nextInt(100000);

动车1号.add(new PriorityQueueModel(id, "座号" + id));

}

System.out.println("\n乘车信息:");

while(true){

PriorityQueueModel model = 动车1号.poll(); // poll

if(model == null) {

break;

}

System.out.println(model.getName());

}

}

}

输出结果:

SEQ:-1

SEQ:0

SEQ:4

SEQ:37

SEQ:58

SEQ:79

SEQ:84

SEQ:90

SEQ:90

size=0

创建 座号1256

创建 座号39916

创建 座号11350

创建 座号10287

创建 座号79812

创建 座号44573

创建 座号15600

乘车信息:

座号1256

座号10287

座号11350

座号15600

座号39916

座号44573

座号79812

时间: 2024-12-14 12:11:55

数据结构-队列,优先队列的相关文章

【C/C++学院】0828-STL入门与简介/STL容器概念/容器迭代器仿函数算法STL概念例子/栈队列双端队列优先队列/数据结构堆的概念/红黑树容器

STL入门与简介 #include<iostream> #include <vector>//容器 #include<array>//数组 #include <algorithm>//算法 using namespace std; //实现一个类模板,专门实现打印的功能 template<class T> //类模板实现了方法 class myvectorprint { public: void operator ()(const T &

【数据结构】优先队列和堆

优先队列(priority queue) 对于一般的队列是在队列的尾部添加数据,在头部删除,以便先进先出. 而优先队列中的每个元素都有一个优先级,每次将一个元素放入队列中,而每次出队时都是将优先级最大的那个元素出队,称为高进先出(largest-in,first-out). 优先队列必须实现以下几个操作 1.入队(push):将一个元素放入队列中. 2.出队(pop):将优先级最高的元素从队列中删除. 要实现上面的操作可以维护一个有序的链表.每次插入数据时维护整个链表有序,即使用插入法,每次出队

数据结构——队列(Queues)

队列的存储特性:FIFO(first in first out)即先进先出原则 单向/双向队列 *优先队列(与queue不同) 存储方式: 带尾指针的单向链表 / 数组 queue类: queue(); bool empty() const; T &front(); //最先入的 队首元素 const T &front() const; void pop(); //删除队首元素 void push(const T &item); //加在队列尾 int size() const;

基本数据结构-队列的实现及其运用

二.队列 队列是一种先进先出的数据结构,元素只能添加到队尾,而对元素的删除,修改,检索只能在队头进行.与栈的差异是很明显的.同样队列的实现可以基于链表,也可以基于数组.和栈的基本操作差不多,但队列多了一个指针(标号)指向末尾的元素,因为需要在末尾插入元素. 1.队列的链表实现 #ifndef QUEUE_H #define QUEUE_H #include <iostream> template <class T> class queue { public: queue(); ~q

队列&amp;优先队列

1.队列 普通的队列都是先进先出,元素从队尾添加,从队头删除. function queue(){ var arr=[]; this.enqueue=function(item){ arr.push(item); }; this.dequeue=function(){ arr.shift(); }; this.queueSize=function(){ return arr.length; }; this.isEmpty=function(){ return arr.length==0; };

数据结构—队列

数据结构-队列 1.队列的定义 队列(Queue)也是一种运算受限的线性表,它的运算限制与栈不同,是两头都有限制,插入只能在表的一端进行(只进不出),而删除只能在表的另一端进行(只出不进),允许插入的一端称为队尾(rear),允许删除的一端称为队头 (Front) 队列模型 2.队列的操作 队列的操作原则是先进先出的,所以队列又称作FIFO表(First in First out) 置空队:InitQueue(Q) 判队空:QueueEmpty(Q) 判队满:QueueFull(Q) 入队:En

java数据结构队列

队列类似于现实生活中的排队.队列是先进先出的原则,只允许在队列头部去除元素,队列尾部添加元素. 下面是分别用数组和链表为存储结构实现的队列 public interface Queue<T> { int size(); T remove(); void add(T element); boolean isEmpty(); void clear(); boolean hasElement(); } public class ArrayQueue<T> implements Queue

数据结构--队列实现(顺序队列和链队列)与C++模板

数据结构--队列实现(顺序队列和链队列)与C++模板 一.顺序队列 队列的顺序存储结构称为顺序队列,顺序队列实际上是运算受限的顺序表. ①和顺序表一样,顺序队列用一个向量空间来存放当前队列中的元素. ②由于队列的队头和队尾的位置是变化的,设置两个指针front和rear分别指示队头元素和队尾元素在向量空间中的位置,它们的初值在队列初始化时均应置为0. 注意: ①当头尾指针相等时,队列为空. ②在非空队列里,队头指针始终指向队头元素,尾指针始终指向队尾元素的下一位置.(所以以下循环顺序队列中当队尾

HDU 1242 &amp;&amp; ZOJ 1649( BFS (队列 || 优先队列)).

~~~~ 突然发现一篇搜索的题目都有写.昨天发现道bfs题目,HDU上AC, ZOJ上WA.不得不说HDU上的数据之水.. 今天早起刷题有了思路,并用队列和单调队列都写了一遍,0MS飘过~~ ~~~~ 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1242 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=649 ~~~~ 首先有坑的地方是friends,对嘛,朋友有很多,ang

数据结构--队列之C数组实现

队列是一种限定操作的线性表,它只能在表的一段插入,另外一段取出. 所以也称为先进先出数据结构(FIFO---First In First Out) C代码如下(有小bug不想调了,作为参考即可): #include<stdio.h> #define maxsize 5 typedef int ElemType; typedef struct queue { int head; int tail; ElemType Data[maxsize]; }Queue; void InitQueue(Qu