`

数据结构学习笔记-队列(JAVA)

    博客分类:
  • Java
 
阅读更多

概念:队列是一种运算受限的线性表,它先进先出
队列的操作有:
构造队列、销毁队列、清空队列、计算队列长度、取队头元素、元素入队和元素出对
代码:
package com.alg.queue;
import java.util.ConcurrentModificationException;
import java.util.Iterator;
import java.util.NoSuchElementException;
//用数组实现队列
//队列是一种运算受限的线性表,它先进先出
//队列的操作有:构造队列、销毁队列、清空队列、计算队列长度、取队头元素、元素入队和元素出对
//Iterable为对for循环的支持
public class Queue<T> implements Iterable<T>
{
    protected Object[] elementData = null;
    // 默认数组大小
    private static final int DEFAULT_SIZE = 10;
    // 数组的每次增长幅度
    protected int capacityIncrement;
    // 操作数
    private int modCount;
    // 统计数组内保存的元素数量
    private int elementCount;
    public Queue()
    {
        this(DEFAULT_SIZE, 0);
    }
    public Queue(int capacity)
    {
        this(capacity, 0);
    }
    public Queue(int capacity, int capacityIncrment)
    {
        elementData = newElementArray(capacity);
        elementCount = 0;
        this.capacityIncrement = capacityIncrment;
    }
    // 清空队
    public void clear()
    {
        for (int i = 0; i < elementCount; i++)
        {
            elementData[i] = null;
        }
        modCount++;
        elementCount = 0;
    }
    // 取队头元素
    @SuppressWarnings("unchecked")
    public T peek()
    {
        T t = null;
        if (elementCount > 0)
        {
            t = (T) elementData[0];
        }
        return t;
    }
    // 出队
    @SuppressWarnings("unchecked")
    public T dequeue()
    {
        T t = null;
        if (elementCount > 0)
        {
            t = (T) elementData[0];
            System.arraycopy(elementData, 1, elementData, 0, --elementCount);
            modCount++;
        }
        return t;
    }
    // 入队
    public void enqueue(T object)
    {
        // 栈满,增加栈容量
        if (elementCount == elementData.length)
        {
            growByOne();
        }
        elementData[elementCount++] = object;
        modCount++;
    }
    @SuppressWarnings( {"unused", "unchecked"})
    private T[] newElementArray(int size)
    {
        return (T[]) new Object[size];
    } // 如果从节省空间角度考虑capacityIncrement最好设置
    private void growByOne()
    {
        int adding = 0;
        // 没有设置增量的情况
        if (capacityIncrement <= 0)
        { // 如果elementData长度为0,就加1,否则就增加elementData.length的一倍
            if ((adding = elementData.length) == 0)
            {
                adding = 1;
            }
        }
        else
        {
            adding = capacityIncrement;
        }
        T[] newData = newElementArray(elementData.length + adding);
        System.arraycopy(elementData, 0, newData, 0, elementCount);
        elementData = newData;
    }
    @SuppressWarnings("unchecked")
    public synchronized T remove(int location)
    {
        if (location < elementCount)
        {
            T result = (T) elementData[location];
            elementCount--;
            int size = elementCount - location;
            // 把location + 1到最后整个拷贝到从location开始到最后
            if (size > 0)
            {
                System.arraycopy(elementData, location + 1, elementData, location, size);
            }
            // 因为中间的某个删除的位置被覆盖,所以需要把最后一位直空
            elementData[elementCount] = null;
            modCount++;
            return result;
        }
        throw new ArrayIndexOutOfBoundsException(location);
    }
    // 增加了对for循环的支持
    public Iterator<T> iterator()
    {
        return new SimpleIterator();
    }
    @SuppressWarnings("unchecked")
    public synchronized T elementAt(int location)
    {
        if (location < elementCount)
        {
            return (T) elementData[location];
        }
        throw new ArrayIndexOutOfBoundsException(location);
    }
    public int size()
    {
        return elementCount;
    }
    // 简单了实现迭代器
    private class SimpleIterator implements Iterator<T>
    {
        int pos = -1;
        int expectedModCount;
        int lastPosition = -1;
        SimpleIterator()
        {
            super();
            expectedModCount = modCount;
        }
        public boolean hasNext()
        {
            return pos + 1 < size();
        }
        public T next()
        {
            if (expectedModCount == modCount)
            {
                try
                {
                    T result = elementAt(pos + 1);
                    lastPosition = ++pos;
                    return result;
                }
                catch (IndexOutOfBoundsException e)
                {
                    throw new NoSuchElementException();
                }
            }
            throw new ConcurrentModificationException();
        }
        public void remove()
        {
            if (this.lastPosition == -1)
            {
                throw new IllegalStateException();
            }
            if (expectedModCount != modCount)
            {
                throw new ConcurrentModificationException();
            }
            try
            {
                Queue.this.remove(lastPosition);
            }
            catch (IndexOutOfBoundsException e)
            {
                throw new ConcurrentModificationException();
            }
            expectedModCount = modCount;
            if (pos == lastPosition)
            {
                pos--;
            }
            lastPosition = -1;
        }
    }
}

package com.alg.queue;
public class QueueMain
{
    public static void main(String[] args)
    {
        Queue<String> queue = new Queue<String>();
        queue.enqueue("a");
        queue.enqueue("b");
        queue.enqueue("c");
        queue.enqueue("d");
        queue.enqueue("e");
        System.out.print("入队:");
        for (String q : queue)
        {
            System.out.print(q + " ");
        }
        System.out.println("出队元素:" + queue.dequeue());
        System.out.print("出队后:");
        for (String q : queue)
        {
            System.out.print(q + " ");
        }
        System.out.println("取队头元素:" + queue.peek());
        queue.clear();
        System.out.println("清空队:" + queue.size());
    }
}
运行结果:
入队:a b c d e 出队元素:a
出队后:b c d e 取队头元素:b
清空队:0
分享到:
评论

相关推荐

    java数据结构和算法学习笔记

    ### Java数据结构与算法学习笔记知识点总结 #### 一、数据结构概述 数据结构是对数据的一种组织形式,它决定了数据的存储方式以及处理数据的方法。常见的数据结构包括但不限于数组、链表、栈、队列、二叉树、图等...

    数据结构学习笔记-链表中的双向链表(JAVA)

    在数据结构的学习中,链表是一种非常基础且重要的概念,特别是在Java编程中。本文将深入探讨标题中的主题——“双向链表”。双向链表是一种特殊形式的链表,每个节点不仅包含指向下一个节点的指针,还包含一个指向前...

    数据结构高分笔记part1

    2. **线性数据结构**:线性数据结构如数组、链表、栈和队列是学习的基础。笔记可能详细讲解了数组的连续存储和随机访问特性,链表的动态内存分配和指针操作,栈的“后进先出”(LIFO)原则,以及队列的“先进先出”...

    Java数据结构和算法-学习笔记

    ### Java数据结构与算法——学习笔记 #### 一、引言 在计算机科学领域,**数据结构**与**算法**是两个极其重要的概念。数据结构指的是数据的组织方式,而算法则是解决特定问题的一系列步骤。这两者是编程的基础,...

    数据结构与算法-学习笔记 Java 版.zip

    逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树...学习算法与数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。

    数据结构与算法分析-JAVA实现-带书签目录超清文字版

    本书“数据结构与算法分析-JAVA实现”专注于使用Java编程语言来阐述这些概念,这对于Java开发者来说是一份极其宝贵的学习资源。 首先,我们要理解数据结构。数据结构不仅仅是关于如何在计算机内存中组织数据,更是...

    Java数据结构和算法学习笔记

    ### Java数据结构与算法学习笔记知识点详解 #### 一、数据结构概述 数据结构是对数据的一种组织形式,它决定了数据的存储方式以及处理数据的方法。常见的数据结构包括但不限于数组、链表、栈、队列、二叉树、图等...

    JAVA数据结构笔记

    本笔记主要涵盖了从第一章到第六章关于数据结构和Java语言的相关知识点。 第一章介绍了数据结构的基本概念,包括面向对象的特性如对象、继承和多态,对比了C++和Java中的指针差异。在Java中,垃圾回收机制自动管理...

    数据结构与问题求解——java语言描述 源码

    数据结构主要包括数组、链表、栈、队列、树、图、集合和哈希表等。在Java中,这些数据结构可以通过内置类如ArrayList、LinkedList、Stack、Queue、HashSet和HashMap等来实现。例如,`Graph.java`文件很可能包含了图...

    数据结构与算法分析 Java语言描述 读书笔记

    在Java语言中,理解并应用数据结构和算法能够帮助开发者编写出更高效、更优化的代码。这篇读书笔记主要涵盖了以下几个方面: 1. **基本概念**: - 数据结构:它是组织和存储数据的方式,包括数组、链表、栈、队列...

    哈工大数据结构考验笔记

    哈工大的数据结构考验笔记涵盖了这门课程的关键概念,是准备相关考试的重要参考资料。 首先,让我们深入探讨标题和描述中提及的知识点: 1. **第一章 绪论**: - **黑体字概念**:通常在教材或笔记中,黑体字用于...

    《Java数据结构和算法》学习笔记(3)——栈和队列

    本文将基于《Java数据结构和算法》学习笔记中的“栈和队列”部分进行深入探讨。 栈(Stack)是一种线性数据结构,遵循后进先出(LIFO, Last In First Out)的原则。在栈中,元素的添加(压栈)和移除(弹栈)都是在...

    Java架构面试专题(含答案)和学习笔记-1

    - **数据类型与数据结构**:深入理解原始数据类型、引用类型,以及数组、链表、队列、栈等常见数据结构的原理和应用。 - **异常处理**:理解Checked和Unchecked异常的区别,掌握如何正确使用try-catch-finally语句...

    java数据结构与算法中文版

    《Java数据结构与算法...总的来说,《Java数据结构与算法中文版》是Java开发者提升自身技术水平的宝贵资源,通过深入学习和实践书中的内容,可以提高代码质量,解决复杂问题,并为软件工程的优化和扩展打下坚实基础。

    Java并发编程与高并发解决方案-学习笔记-www.itmuch.com.pdf

    本文将基于文档《Java并发编程与高并发解决方案-学习笔记***.pdf》中提供的内容,来详细阐述并发编程和高并发的基本概念、CPU多级缓存与缓存一致性、以及Java内存模型。 ### 并发与高并发概念 在现代多线程编程中...

    Java数据结构和算法笔记.doc

    【Java数据结构和算法笔记】 在Java编程中,数据结构和算法是核心概念,它们直接影响程序的效率和可维护性。本笔记主要基于《Java数据结构和算法》(第二版)一书,概述了各种常见数据结构的特性及经典算法。 1. **...

    《恋上数据结构》第1季度 + 第2季 完整学习笔记,从0实现的 Java 数据结构大全。.zip

    在《恋上数据结构》的学习笔记中,涵盖了第一季和第二季的完整内容,这通常意味着笔记会全面讲解从基础到进阶的数据结构知识,并且使用Java语言进行实现,让学习者能通过实践加深理解。 数据结构主要包括以下几大类...

    程序员数据结构学习笔记

    本文将详细解析数据结构的学习笔记,并针对其中提到的关键知识点进行深入探讨。 首先,数据结构中对象的定义是理解一切的基础。对象是具有特定属性和行为的数据单位,比如在数组中,每个元素就是一个对象,它有自己...

Global site tag (gtag.js) - Google Analytics