java数据结构之队列
队列概述
队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
–队尾(rear)——允许插入的一端
–队头(front)——允许删除的一端
队列特点:先进先出(FIFO)
线性表的操作主要包括:
(1)清空队列
(2)判断是否为空
(3)元素的个数
(4)入队列
(5)出队列
(6)取对头元素
接口
对队列的抽象数据类型定义Queue接口如下:
package com.example.code;
public interface Queue {
/**
* 清空队列
*/
public void clear();
/**
* 出队列
* @return
*/
public Object deQueue();
/**
* 判断是否为空
* @return
*/
public boolean isEmpty();
/**
* 取对头元素
* @return
*/
public Object peek();
/**
* 入队列
* @param obj
*/
public void push(Object obj);
/**
* 元素的个数
* @return
*/
public int size();
}
顺序循环队列
结构模型:
存在问题
设数组长度为M,则:
–当front=0,rear=M时,再有元素入队发生溢出——真溢出
–当front!=0,rear=M时,再有元素入队发生溢出——假溢出
解决方案
–队首固定,每次出队剩余元素向下移动——浪费时间
–循环队列
»基本思想:把队列设想成环形,让sq[0]接在sq[M-1]之后,若rear+1==M,则令rear=0;
模拟ArrayQueue实现Queue
package com.example.code;
public class MyArrayQueue implements Queue {
private static int DEFAULT_SIZE = 10;
private Object array[] = null;
private int front, rear, count; //队首,队尾标注和队列的大小
public MyArrayQueue() {
array = new Object[DEFAULT_SIZE];
front = rear = count = 0;
}
@Override
public void clear() {
for(int i=0; i<DEFAULT_SIZE; i++) {
array[i] = null;
}
front = rear = count = 0;
}
@Override
public Object deQueue() {
if(0 == count) {
throw new IllegalStateException("队列已空,无数据元素可出队列!");
} else {
Object obj = array[front];
front = (front+1)%DEFAULT_SIZE;
count --;
return obj;
}
}
@Override
public boolean isEmpty() {
if((rear == front) && (0 == count))
return true;
else
return false;
}
@Override
public Object peek() {
if(0 == count) {
throw new IllegalStateException("队列已空,无数据元素可出队列!");
} else{
return array[front];
}
}
private void expand() {
Object newArray[] = new Object[2*DEFAULT_SIZE];
for(int i=0; i<count; i++) {
newArray[i] = array[(front+i)%DEFAULT_SIZE];
}
array = newArray;
front = 0;
rear = count;
DEFAULT_SIZE = 2*DEFAULT_SIZE;
}
@Override
public void push(Object obj) {
if((rear == front) && (count>0))
expand();
array[rear] = obj;
rear = (rear+1)%DEFAULT_SIZE;
count ++;
}
@Override
public int size() {
return count;
}
}
链式队列
结构模型
模拟LinkQueue实现Queue接口
package com.example.code2;
import com.example.code.Queue;
public class MyLinkQueue implements Queue {
private Node front,rear; //队头指针和队尾指针
private int size;
public MyLinkQueue() {
front = rear = new Node();
size = 0;
}
@Override
public void clear() {
front.next = null;
rear = front;
size = 0;
}
@Override
public Object deQueue() {
Node p = front.next;
front.next = p.next;
rear = p.next;
size --;
return p.data;
}
@Override
public boolean isEmpty() {
if(size == 0)
return true;
else
return false;
}
@Override
public Object peek() {
return front.next.data;
}
@Override
public void push(Object obj) {
Node p = new Node(obj);
rear.next = p;
rear = p;
size ++;
}
@Override
public int size() {
return size;
}
public String toString() {
StringBuilder sb= new StringBuilder("[");
Node p = front;
while((p=p.next) != null) {
sb.append(p.data + ", ");
}
sb.append("]");
return sb.toString();
}
}
/**
* 链队列的结点
*
*/
class Node{
Object data; //数据元素
Node next; //后驱结点
public Node() {
this(null);
}
public Node(Object data) {
this.data = data;
this.next = null;
}
}
转载:http://blog.csdn.net/luoweifu/article/details/8507835
java数据结构之队列的更多相关文章
- Java数据结构之队列的实现以及队列的应用之----简单生产者消费者应用
Java数据结构之---Queue队列 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在 ...
- 图解Java数据结构之队列
本篇文章,将对队列进行一个深入的解析. 使用场景 队列在日常生活中十分常见,例如:银行排队办理业务.食堂排队打饭等等,这些都是队列的应用.那么队列有什么特点呢? 我们知道排队的原则就是先来后到,排在前 ...
- java数据结构---循环队列
#java学习经验总结------循环队列的实现(数组) package datastructure;/*数组实现循环队列 队列first in first out*/ public class Ci ...
- Java数据结构——优先级队列
//================================================= // File Name : PriorityQueue_demo //------------ ...
- Java数据结构之队列(Queue)
1.使用场景 银行排队的案例: 2.队列介绍 队列是一个有序列表,可以用数组或是链表来实现. 遵循先入先出的原则: 先存入队列的数据,要先取出. 后存入的要后取出 示意图:(使用数组模拟队列示意图) ...
- Java数据结构——循环队列
普通顺序队列存在的问题在普通顺序队列中,入队的操作就是先将尾指针rear右移一个单位,然后将元素值赋值给rear单位.出队时,则是头指针front后移一个单位.像这样进行了一定数量的入队和出队操作后, ...
- java数据结构-08队列
一.什么是队列 队列是一种特殊的线性表,只能在头尾两端进行操作,特点是先进先出:就像排队买票一样,先来的先买 二.接口设计 三.代码实现 可以使用动态数组.链表等实现:这里两种实现栈与双向链表 1. ...
- java 数据结构 队列的实现
java 数据结构队列的代码实现,可以简单的进行入队列和出队列的操作 /** * java数据结构之队列的实现 * 2016/4/27 **/ package cn.Link; import java ...
- 【Java数据结构学习笔记之二】Java数据结构与算法之队列(Queue)实现
本篇是数据结构与算法的第三篇,本篇我们将来了解一下知识点: 队列的抽象数据类型 顺序队列的设计与实现 链式队列的设计与实现 队列应用的简单举例 优先队列的设置与实现双链表实现 队列的抽象数据类型 ...
随机推荐
- 用python做文本情感分析
情感分析就是分析一句话说得是很主观还是客观描述,分析这句话表达的是积极的情绪还是消极的情绪.原理比如这么一句话:“这手机的画面极好,操作也比较流畅.不过拍照真的太烂了!系统也不好.” ① 情感词 要分 ...
- SPFA穿越虫洞——负权回路得判断
poj3259 题目大意:穿越虫洞可以回到过去(时间--)所以能不能让时间倒流呢,就是判断有没有负权回路这次尝试用SPFA算法,也可以复习一下链式前向星 准备工作,队列q,spfa算法得有点就在于这个 ...
- Delphi for iOS开发指南(7):在iOS应用程序中使用WebBrowser组件
Delphi for iOS开发指南(7):在iOS应用程序中使用WebBrowser组件 在FireMonkey iOS应用程序中使用WebBrowser 在iOS平台上,FireMonkey使用T ...
- CSharp程序员学Android开发---3.Android内部元素不填充BUG
最近公司组织项目组成员开发一个Android项目的Demo,之前没有人有Andoid方面的开发经验,都是开发C#的. 虽说项目要求并不是很高,但是对于没有这方面经验的人来说,第一步是最困难的. 项目历 ...
- WebAPI+Html跨域时对session的支持
1.Global.asax中添加对Session的支持,重新Init方法: public override void Init() { this.PostAuthenticateRequest += ...
- [转载]未能从程序集“System.Web.WebPages, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”中加载类型“System.Web.WebPages.DisplayModeProvider”
转载于http://bkcoding.cn/post_1210.html 使用vs2010开发asp.net mvc程序时,出现 未能从程序集“System.Web.WebPages, Version ...
- BitAdminCore框架应用篇:(五)核心套件querySuite列的定义
索引 NET Core应用框架之BitAdminCore框架应用篇系列 框架演示:http://bit.bitdao.cn 框架源码:https://github.com/chenyinxin/coo ...
- Ocelot中文文档入门
入门 Ocelot仅适用于.NET Core,目前是根据netstandard2.0构建的,如果Ocelot适合您,这个文档可能会有用. .NET Core 2.1 安装NuGet包 使用nuget安 ...
- AJPFX平台有哪些优势?
AJPFX为全世界的客户提供高端金融投资产品服务.在欧洲,大洋洲.北美洲,亚洲均设有交易专用服务器,以保证交易系统正常和高速运作.给投资者提供可靠.稳定.正确的交易服务系统也是我们一直以来为客户提供的 ...
- Python 获取秒级时间戳与毫秒级时间戳
原文:Python获取秒级时间戳与毫秒级时间戳 1.获取秒级时间戳与毫秒级时间戳 import time import datetime t = time.time() print (t) #原始时间 ...