自己实现数据结构系列四---Queue
一.代码部分
1.定义接口:
public interface Queue<E> {
void enqueue(E e);
E dequeue();
E getFront();
int getSize();
boolean isEmpty();
}
2.基于数组的实现
public class ArrayQueue<E> implements Queue<E> {
private ArrayList<E> arrayList;
public ArrayQueue(int capacity){
arrayList = new ArrayList<>(capacity);
}
public ArrayQueue(){
arrayList = new ArrayList<>();
}
@Override
public void enqueue(E e) {
arrayList.addLast(e);
}
@Override
public E dequeue() {
return arrayList.removeFirst();
}
@Override
public E getFront() {
return arrayList.get(0);
}
@Override
public int getSize() {
return arrayList.getSize();
}
@Override
public boolean isEmpty() {
return arrayList.isEmpty();
}
}
3.改进链表实现队列:
public class LinkedListQueue<E> implements Queue<E> {
//节点,用来存放数据:数据+下一个元素的引用
private class Node{
private E e;
private Node next;
public Node(E e,Node next){
this.e = e;
this.next = next;
}
public Node(E e){
this(e,null);
}
public Node(){
this(null,null);
}
public String toString(){
return e.toString();
}
}
private Node head;//头节点
private Node tail;//尾节点
private int size;
public LinkedListQueue(){
head = null;
tail = null;
size =0;
}
@Override
public void enqueue(E e) {
if (tail == null){
tail = new Node(e);
head = tail;
}else {
tail.next = new Node(e);
tail = tail.next;
}
size++;
}
@Override
public E dequeue() {
if(isEmpty())
throw new IllegalArgumentException("empty");
Node retNode = head;
head = head.next;
retNode.next = null;
if (head == null){
tail = null;
}
size--;
return retNode.e;
}
@Override
public E getFront() {
if(isEmpty())
throw new IllegalArgumentException("empty");
return head.e;
}
@Override
public int getSize() {
return size;
}
@Override
public boolean isEmpty() {
return size ==0;
}
@Override
public String toString() {
StringBuilder res = new StringBuilder();
res.append("queue:front");
Node cur = head;
while (cur != null){
res.append(cur + "->");
cur = cur.next;
}
res.append("null tail");
return res.toString();
}
}
3.循环队列:
public class LoopQueue<E> {
private E[] data;
private int front;//队列头
private int tail;//队列尾
private int size;
/**
* 初始化容量的构造方法
* @param capacity
*/
public LoopQueue(int capacity){
data = (E[]) new Object[capacity+1]; //注意加一
front = 0;
tail = 0;
size = 0;
}
/**
* 无参的构造方法
*/
public LoopQueue(){
this(10);
}
public int getCapacity(){
return data.length-1;
}
public boolean isEmpty(){
return front == tail;
}
public int getSize(){
return size;
}
/**
* 改变数组容量
* @param newCapacity
*/
private void resize(int newCapacity){
E[] newData = (E[]) new Object[newCapacity+1];
for (int i = 0; i < size; i++) {
newData[i] = data[(i+front)%data.length];
}
data = newData;
front = 0;
tail = size;
}
/**
* 入队
* @param e
*/
public void enqueue(E e){
if ((tail+1)%data.length == front){
resize(getCapacity()*2);
}
data[tail] = e;
tail = (tail+1)%data.length;//注意这里不是tail++
size++;
}
/**
* 出队
* @return
*/
public E dequeue(){
if (isEmpty()){
throw new IllegalArgumentException("can't dequeue");
}
E ret = data[front];
data[front] = null;
front = (front+1)%data.length;//注意这里不是front++
size--;
if(size == getCapacity()/4 && getCapacity()/2 != 0){
resize(getCapacity()/2);
}
return ret;
}
/**
* 队列头
* @return
*/
public E getFront(){
if (isEmpty()){
throw new IllegalArgumentException("queue is empty");
}
return data[front];
}
@Override
public String toString() {
StringBuilder res = new StringBuilder();
res.append(String.format("queue size =%d, capacity = %d\n"),size,getCapacity());
res.append("front [");
for (int i = front; i != tail; i = (i=1)%data.length) {
res.append(data[i]);
if((i+1)%data.length != tail){
res.append(",");
}
}
res.append("] tail");
return res.toString();
}
}
自己实现数据结构系列四---Queue的更多相关文章
- 【JavaScript数据结构系列】03-队列Queue
[JavaScript数据结构系列]03-队列Queue 码路工人 CoderMonkey 转载请注明作者与出处 1. 认识队列Queue结构 队列,跟我们的日常生活非常贴近,我们前面举例了食堂排队打 ...
- <数据结构系列3>队列的实现与变形(循环队列)
数据结构第三课了,今天我们再介绍一种很常见的线性表——队列 就像它的名字,队列这种数据结构就如同生活中的排队一样,队首出队,队尾进队.以下一段是百度百科中对队列的解释: 队列是一种特殊的线性表,特殊之 ...
- 【C#数据结构系列】查找
一:查找 1.1 基本概念和术语 查找(Search)是在数据结构中确定是否存在关键码等于给定关键码的记录的过程.关键码有主关键码和次关键码.主关键码能够唯一区分各个不同的记录,次关键码通常不能唯一区 ...
- <数据结构系列2>栈的实现与应用(LeetCode<有效的的括号>)
首先想要实现栈,就得知道栈为何物,以下一段摘抄至百度百科: 栈(stack)又名堆栈,它是一种运算受限的线性表.其限制是仅允许在表的一端进行插入和删除运算.这一端被称为栈顶,相对地,把另一端称为栈底. ...
- 【JavaScript数据结构系列】04-优先队列PriorityQueue
[JavaScript数据结构系列]04-优先队列PriorityQueue 码路工人 CoderMonkey 转载请注明作者与出处 ## 1. 认识优先级队列 经典的案例场景: 登机时经济舱的普通队 ...
- 【JavaScript数据结构系列】00-开篇
[JavaScript数据结构系列]00-开篇 码路工人 CoderMonkey 转载请注明作者与出处 ## 0. 开篇[JavaScript数据结构与算法] 大的计划,写以下两部分: 1[JavaS ...
- 前端构建大法 Gulp 系列 (四):gulp实战
前端构建大法 Gulp 系列 (一):为什么需要前端构建 前端构建大法 Gulp 系列 (二):为什么选择gulp 前端构建大法 Gulp 系列 (三):gulp的4个API 让你成为gulp专家 前 ...
- JAVA数据结构系列 栈
java数据结构系列之栈 手写栈 1.利用链表做出栈,因为栈的特殊,插入删除操作都是在栈顶进行,链表不用担心栈的长度,所以链表再合适不过了,非常好用,不过它在插入和删除元素的时候,速度比数组栈慢,因为 ...
- Netty4.x中文教程系列(四) 对象传输
Netty4.x中文教程系列(四) 对象传输 我们在使用netty的过程中肯定会遇到传输对象的情况,Netty4通过ObjectEncoder和ObjectDecoder来支持. 首先我们定义一个U ...
随机推荐
- NumPy 中的集合运算
怎样快速找出两个数组中相同的元素? numpy.isin(element,test_elements,assume_unique = False,invert = False ) 计算test_ele ...
- 【爬坑】远程连接 MySQL 失败
问题描述 远程连接 MySQL 服务器失败 报以下错误 host 192.168.23.1 is not allowed to connect to mysql server 解决方案 在服务器端打开 ...
- windows入侵
一, ping 用来检查网 络是否通畅或者网络连接速度的命令.作为一个生 活在网络上的管理员或者黑 客来说, ping 命令是第一个必须掌握的 DOS 命令,所利用的原理是这样的网络上的机器都有唯一确 ...
- 【算法】LeetCode算法题-Two Sum
程序 = 数据结构 + 算法. 算法是每一位程序员学习成长之路上无法避开的重要一环,并且越早接触越好.今后会每天做些算法题,至少每天做一道题目,同时会记录自己的解题思路和代码,通过[算法]专题来分享. ...
- Mac轻量级服务器http-server
刚想跑个Vue页面,发现我本地没有应用服务器(Tomcat/IIS...) 于是想下载了Tomcat,才发现我没有装JDK,而Mac的JDK下得好久,都下不下来,想想算了. 于是在网上找个轻量级的服务 ...
- JZOJ 5602.【NOI2018模拟3.26】Cti
JZOJ 5602.[NOI2018模拟3.26]Cti Description 有一个 \(n×m\) 的地图,地图上的每一个位置可以是空地,炮塔或是敌人.你需要操纵炮塔消灭敌人. 对于每个炮塔都有 ...
- 15.selenium_case02
# 抓取今日头条的新闻链接 from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWa ...
- RS-485总线通信协议
https://blog.csdn.net/ouyangxin95/article/details/78174145 RS-485总线技术只是规定了接口的电气标准,并没有规定RS-485接口的电缆,插 ...
- GT--记录android app消耗的cpu/内存/流量/电量
腾讯GT简介: 此apk是一款可以对APP进行测试的软件,可以在任何情况下快速测试手机app的CPU.内存.流量.电量.帧率/流畅度等性能测试.有安卓版本和ios版本,分别下载 1.下载腾讯GT ht ...
- 机器学习三剑客之Matplotlib基本操作
Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形 . 通过 Matplotlib,可以仅需要几行代码,便可以生成绘图,线型图, ...