算法_队列的Java通用数组实现
在实现Queue的API的时候,可以使用两个实例变量做索引,一个变量head指向队列的开头,另一个变量tail指向队列的结尾.在删除一个元素的时候,使用head访问,并将head+1,插入一个元素的时候,使用tail保存它,并将tail加1.如果某个索引增加到超过了数组的边界的时候,则将它重置为0.下面是队列的数组实现,除了对于头元素和尾元素的基本操作以外,其余基本和堆栈相同.
import java.util.Iterator; //编写一个类ResizingArrayQueueOfStrings使用定长数组实现队列的抽象,
//然后扩展实现,使用调整数组的方法突破数组大小的限制
public class ResizingArrayQueueOfStrings<Item> implements Iterable<Item> {
private Item[] a=(Item[])new Object[1];
int head=0; //指向队列的开头的索引
int tail=0; //指向队列的结尾的索引
int N; //数组中装填的元素数量 public boolean isEmpty() {
return N==0;
}
public int size() {
return N;
}
public void add(Item item) {
if(N==a.length) resize(a.length*2);//N增加至数组容量的时候,动态扩展数组的大小
a[tail++]=item; //从tail(尾部)索引处获取元素.
if(tail==a.length) tail=0; //如果tail索引增加到了数组的长度,那么重新置0
N++; //增加N.
}
public Item remove() {
Item item=a[head]; //从队列头移除元素
a[head++]=null; //将队列头的元素设为null,避免对象游离
N--; //将N减一
if(head==a.length) head=0; //如果head索引增加到了数组的长度,重新置0
if(N<a.length/4) resize(a.length/2);
return item; //返回队列头部的元素.
}
public void resize(int n) /*动态调整数组大小的方法*/{
//将数组引用指向一个更大的数组
Item[] items=(Item[])new Object[n];
for(int i=0;i<N;i++) {
items[i]=a[(i+head)%a.length]; //从头元素开始赋值给新的元素.
}
a=items;
//将头元素和尾部元素分别置位.
head=0;
tail=N;
}
@Override
public Iterator<Item> iterator() {
return new QueueIterator();
}
class QueueIterator implements Iterator<Item> {
int i=0;
@Override
public boolean hasNext() {
return i<N;
} @Override
public Item next() {
Item item=a[(i+head)%a.length]; //从头元素开始获取元素.
i++;
return item;
} }
}
算法_队列的Java通用数组实现的更多相关文章
- 算法_栈的Java的通用数组实现
栈是一个常用的最简单的数据结构,这里提供了其实现.内部维护了一个数组,并且可以动态的调整数组的大小.而且,提供了迭代器支持后进先出的迭代功能.Stack的实现是所有集合类抽象数据类型实现的模板,它将所 ...
- Java使用反射的通用数组复制方法
Java通用数组复制方法 在Arrays工具类中,提供了一个copyOf(T[] original, int newLength)方法,用于复制任意类型的对象数组,但是由于泛型不能作用于基本类型,所以 ...
- 算法_栈与队列的Java链表实现
链表是一个递归的数据结构,它或者为null,或者是指向一个结点的引用,该结点含有一个泛型的元素和指向另一个链表的引用.可以用一个内部类来定义节点的抽象数据类型: private class Node ...
- Java的数组,集合,数据结构,算法(一)
本人的愚见,博客是自己积累对外的输出,在学习初期或自己没有多少底料的情况下,与其总结写博客不如默默去搞自己的代码,但是学到集合这一块时,数组,集合,数据结构,算法这个概念搞的我比较混淆,所以不得已写这 ...
- php与java通用AES加密解密算法
AES指高级加密标准(Advanced Encryption Standard),是当前最流行的一种密码算法,在web应用开发,特别是对外提供接口时经常会用到,下面是我整理的一套php与java通用的 ...
- Java中数组的几个常用算法:插入算法,删除算法,冒泡排序算法
前言: 在Java中我们常常会用数组,提到数组就不得不介绍数组中常用到的几个算法. 有插入算法,删除算法,冒泡排序算法等. 在学习这几个数组的算法前,我们先来了解一下关于数组一些基本知识. 数组的基本 ...
- JavaScript 数据结构与算法之美 - 线性表(数组、栈、队列、链表)
前言 基础知识就像是一座大楼的地基,它决定了我们的技术高度. 我们应该多掌握一些可移值的技术或者再过十几年应该都不会过时的技术,数据结构与算法就是其中之一. 栈.队列.链表.堆 是数据结构与算法中的基 ...
- 三 基于Java动态数组手写队列
手写队列: package dataStucture2.stackandqueue; import com.lt.datastructure.MaxHeap.Queue; import dataStu ...
- Java实现 蓝桥杯 算法提高 队列操作
算法提高 队列操作 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 队列操作题.根据输入的操作命令,操作队列(1)入队.(2)出队并输出.(3)计算队中元素个数并输出. 输入格式 ...
随机推荐
- MySQL查询表内重复记录
查询及删除重复记录的方法(一)1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断select * from peoplewhere peopleId in (select p ...
- 各种drawable
BitmapDrawable 可以把小图片平铺布满布局来设置背景. PictureDrawable 记录绘制过程 ClipDrawable 裁剪 进度条 InsetDrawabl ...
- python :eval将字符串转换成字典
#将字符串打印成字典 b=''' {'record': {'weight':20,'server':'100.1.7.9','maxconn':50},'backend': 'www.oldboy.o ...
- htmlnav
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- JDBC批量Insert深度优化(有事务)
环境: MySQL 5.1 RedHat Linux AS 5 JavaSE 1.5 DbConnectionBroker 微型数据库连接池 测试的方案: 执行10万次Insert语句,使用不同方 ...
- 逆序数还原(FZU)
逆序数还原 Accept: 244 Submit: 451 Time Limit: 1000 mSec Memory Limit : 32768 KB Problem Description 有一段时 ...
- 检索COM类工厂中CLSID为{000209FF-0000-0000-C000-000000000046}的组件时失败,原因是出现以下错误: 80070005
检索COM类工厂中CLSID为{000209FF-0000-0000-C000-000000000046}的组件时失败,原因是出现以下错误: 80070005 http://blog.csdn.net ...
- 2016年10月24日 星期一 --出埃及记 Exodus 19:8
2016年10月24日 星期一 --出埃及记 Exodus 19:8 The people all responded together, "We will do everything th ...
- MUI 版本更新
MUI版本更新,一些js,css 就不写了. 一.app 端 1.APP html 代码 <li class="mui-table-view-cell"> <a ...
- 【leetcode❤python】141. Linked List Cycle
#-*- coding: UTF-8 -*- #Method:快慢指针法,建立虚表头,快指针走两步,慢指针走一步,若存在环,则快指针会追上慢指针# Definition for singly-link ...