Java数据结构与算法(4) - ch04队列(Queue和PriorityQ)
队列: 先进先出(FIFO)。
优先级队列: 在优先级队列中,数据项按照关键字的值有序,关键字最小的数据项总在对头,数据项插入的时候会按照顺序插入到合适的位置以确保队列的顺序,从后往前将小于插入项的数据项后移。在图的最小生成树算法中应用优先级队列。
示例代码:
- package chap04.Queue;
- class Queue {
- private int maxSize;
- private long[] queArray;
- private int front;
- private int rear;
- private int nItems;
- public Queue(int s) {
- maxSize = s;
- queArray = new long[maxSize];
- front = 0;
- rear = -1;
- nItems = 0;
- }
- // 插入方法,队尾是数组的最后一项
- public void insert(long j) {
- if (rear == maxSize - 1) {
- rear = -1;
- }
- queArray[++rear] = j;
- nItems++;
- }
- // 先进先出
- public long remove() {
- long temp = queArray[front++];
- if (front == maxSize) {
- front = 0;
- }
- nItems--;
- return temp;
- }
- public long peekFront() {
- return queArray[front];
- }
- public boolean isEmpty() {
- return (nItems == 0);
- }
- public boolean isFull() {
- return (nItems == maxSize);
- }
- public int size() {
- return nItems;
- }
- }
- class PriorityQ {
- private int maxSize;
- private long[] queArray;
- private int nItems;
- public PriorityQ(int s) {
- maxSize = s;
- queArray = new long[maxSize];
- nItems = 0;
- }
- // 插入方法,从大到小排列
- public void insert(long item) {
- int j;
- if (nItems == 0) {
- queArray[nItems++] = item;
- }
- else {
- for (j = nItems - 1; j >= 0; j--) {
- if (item > queArray[j]) { // if new item larger,
- queArray[j + 1] = queArray[j];
- }
- else {
- break;
- }
- }
- queArray[j + 1] = item;
- nItems++;
- }
- }
- // 按照优先级从后往前移除,不再跟先进还是后进有关
- public long remove() {
- return queArray[--nItems];
- }
- public long peekMin() {
- return queArray[nItems - 1];
- }
- public boolean isEmpty() {
- return (nItems == 0);
- }
- public boolean isFull() {
- return (nItems == maxSize);
- }
- }
- class QueueApp {
- public static void main(String[] args) {
- Queue theQueue = new Queue(5);
- theQueue.insert(10);
- theQueue.insert(20);
- theQueue.insert(30);
- theQueue.insert(40);
- theQueue.remove();
- theQueue.remove();
- theQueue.remove();
- theQueue.insert(50);
- theQueue.insert(60);
- theQueue.insert(70);
- theQueue.insert(80);
- while (!theQueue.isEmpty()) {
- long n = theQueue.remove();
- System.out.print(n); // 40, 50, 60, 70, 80
- System.out.print(" ");
- }
- System.out.println("");
- PriorityQ thePQ = new PriorityQ(5);
- thePQ.insert(30);
- thePQ.insert(50);
- thePQ.insert(10);
- thePQ.insert(40);
- thePQ.insert(20);
- while (!thePQ.isEmpty()) {
- long item = thePQ.remove();
- System.out.print(item + " "); // 10, 20, 30, 40, 50
- }
- System.out.println("");
- }
- }
Java数据结构与算法(4) - ch04队列(Queue和PriorityQ)的更多相关文章
- Java数据结构和算法 - 栈和队列
Q: 栈.队列与数组的区别? A: 本篇主要涉及三种数据存储类型:栈.队列和优先级队列,它与数组主要有如下三个区别: A: (一)程序员工具 数组和其他的结构(栈.队列.链表.树等等)都适用于数据库应 ...
- java数据结构与算法值优先级队列
一.优先级队列 什么是优先级队列:优先级队列是一种比栈和队列更加常用的一种数据结构.在优先级队列中,数据项按照关键字的值有序.数据项插入到队列中时,会按照顺序插入到合适的位置,用来保证队列的顺序. 生 ...
- java数据结构和算法03(队列和优先级队列)
什么是队列呢?其实队列跟栈很像,我们可以把栈的底部给弄开,这样数据就可以从下面漏出来了,我们就从下面拿就好了. 可以看到队列是新进先出,就跟我们显示生活中的排队一样,买火车票,飞机票等一样,先去的肯定 ...
- Java数据结构与算法(3) - ch04栈(栈和转置)
栈的基本特性是后进先出,最简单的用途是用于转置,还有其他诸如括号匹配,中序表达式(A+B*(C-D/(E+F)) --> ABCDEF+/-*+)和后续表达式(345+*612+/- --> ...
- Java数据结构和算法(五)——队列
队列.queue,就是现实生活中的排队. 1.简单队列: public class Queqe { private int array[]; private int front; private in ...
- Java数据结构和算法(二)--队列
上一篇文章写了栈的相关知识,而本文会讲一下队列 队列是一种特殊的线性表,在尾部插入(入队Enqueue),从头部删除(出队Dequeue),和栈的特性相反,存取数据特点是:FIFO Java中queu ...
- Java数据结构和算法 - OverView
Q: 为什么要学习数据结构与算法? A: 如果说Java语言是自动档轿车,C语言就是手动档吉普.数据结构呢?是变速箱的工作原理.你完全可以不知道变速箱怎样工作,就把自动档的车子从1档开到4档,而且未必 ...
- Java数据结构和算法(六)——前缀、中缀、后缀表达式
前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...
- Java数据结构和算法(十四)——堆
在Java数据结构和算法(五)——队列中我们介绍了优先级队列,优先级队列是一种抽象数据类型(ADT),它提供了删除最大(或最小)关键字值的数据项的方法,插入数据项的方法,优先级队列可以用有序数组来实现 ...
随机推荐
- C++ - 内置类型的最大值宏定义
内置类型的最大值宏定义 本文地址: http://blog.csdn.net/caroline_wendy/article/details/24311895 C++中, 常常会使用, 某些类型的最大值 ...
- 【C语言探索之旅】 第二部分第二课:进击的指针,C语言的王牌!
内容简介 1.课程大纲 2.第二部分第二课: 进击的指针,C语言的王牌 3.第二部分第三课预告: 数组 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言 ...
- 对比Windows 8模拟器(Simulator)和Windows Phone仿真器(Emulator)
原文:对比Windows 8模拟器(Simulator)和Windows Phone仿真器(Emulator) 从事移动应用开发,经常会用到模拟器(Simulator)和仿真器(Emulator),本 ...
- 【Android进阶】Activity和Fragement中onSaveInstanceState()的使用详解
在activity(或者是fragement)被杀掉之前调用保存每个实例的状态,以保证该状态可以在onCreate(Bundle)或者onRestoreInstanceState(Bundle) (传 ...
- 百度云盘建svnserver步骤
安装tortoisesvn(略) 安装visualsvn(主server您可以使用)(略步骤)例如下面的安装文件夹后,: 注冊百度账号.进入百度云盘页面,建立目录,如mysvn. 下载百度云盘clie ...
- [原创].NET 分布式架构开发实战之四 构建从理想和实现之间的桥梁(前篇)
原文:[原创].NET 分布式架构开发实战之四 构建从理想和实现之间的桥梁(前篇) .NET 分布式架构开发实战之四 构建从理想和实现之间的桥梁(前篇) 前言:上一篇文章讲述了一些实现DAL的理论,本 ...
- poj 3013 Big Christmas Tree (dij+优先级队列优化 求最短)
模板 意甲冠军:给你一个图,1始终根,每一方都有单价值,每个点都有权重新. 每个边缘的价格值 = sum(后继结点重)*单价方值. 最低价格要求树值,它构成了一棵树n-1条边的最小价值. 算法: 1. ...
- nyist 488 素数环(搜索+回溯)
素数环 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描写叙述 有一个整数n,把从1到n的数字无反复的排列成环,且使每相邻两个数(包含首尾)的和都为素数,称为素数环. ...
- MVC常用特性
MVC常用特性使用 简介 在以前的文章中,我和大家讨论如何用SingalR和数据库通知来完成一个消息监控应用. 在上一篇文章中,我介绍了如何在MVC中对MongoDB进行CRUD操作. 今天,我将 ...
- C语言easy忽视的细节(第四部分)
前言:本文的目的是记录C这些语言easy忽视的细节.我会每天花一点时间来阅读整理,坚持下去,今天是第一章.也许今天是下个月的第二,明年,今天是第几?--我坚信,,记性不如烂笔头.第四篇了.fight~ ...