队列的实现(JAVA)
定义
队列(queue)是一种特殊的线性表,它只允许在表的前端进行删除,在表的后端进行插入。
进行插入端的称为队尾,进行删除端的称为队头。队列是先进先出原则的。队列的实现同样可以
使用两种方式来实现,一种是数的实现方式,另一种是链表的实现方式。
队列的实现
我们已经知道队列已经有两种方式实现,虽然底层的实现方式不同,但是其具有的方法是相同
的,我们采用接口定义其具有的操作。
- package com.kiritor;
- /**
- * 队列FIFO的接口
- * @author Kiritor
- * */
- public interface Queue<T> {
- /**
- * 入队:从队尾加入一个元素
- * @param t
- * */
- void add(T t);
- /**
- * 出队:移走队头元素并返回
- * @return 当前队头元素*/
- T remove();
- /**
- * 当前队列的元素个数*/
- int size();
- /**
- * 判断当前队列是否为空
- * @return */
- boolean isEmpty();
- /**
- * 只是返回队头元素,并未删掉
- * @return t*/
- T front();
- }
队列的数组实现
- package com.kiritor;
- import java.util.Arrays;
- /**
- * 基于数组实现的队列
- * @author Kiritor*/
- public class ArrayQueue<T> implements Queue<T>{
- private T[] data;
- private int size;//元素个数
- private int front;//队列中第一个对象的位置
- private int rear;//队列中当前对象的位置
- public ArrayQueue() {
- data = (T[]) new Object[10];
- size = 0;
- front =0;
- rear = 0;
- }
- @Override
- public void add(T t) {
- if(isFull())
- {
- resize();
- front = 0;
- }
- rear = (front+size)%data.length;
- System.out.println(rear);
- data[rear] = t;
- size++;
- }
- @Override
- public T remove() {
- if (isEmpty()) {
- throw new RuntimeException("队列为空!");
- }
- T tempData = data[front];
- data[front] = null;
- //思考一下这里有必要进行除法运算吗?
- front = (front + 1) % (data.length);
- size--;
- return tempData;
- }
- @Override
- public int size() {
- return size;
- }
- @Override
- public boolean isEmpty() {
- return size == 0;
- }
- @Override
- public T front() {
- if (isEmpty()) {
- throw new RuntimeException("队列为空!");
- }
- return data[front];
- }
- /**
- * 判断当前队列是否已满
- * @return*/
- public boolean isFull()
- {
- return size == data.length;
- }
- /**
- * 扩容,2倍
- * */
- public void resize()
- {
- /*注意重新扩容的时候并不需要去设置size
- * 队列的大小并不能通过数组的大小直观的显示出来。
- * 但是栈就可以直观的通过数组的大小显示出来*/
- T[] tmp = (T[]) new Object[data.length*2];
- System.arraycopy(data, 0, tmp, 0, data.length);
- data = tmp;
- tmp = null;//引用置为空,便于gc处理
- }
- public static void main(String[] args) {
- ArrayQueue<String> q = new ArrayQueue<String>();
- q.add("a");
- q.add("b");
- q.add("c");
- q.add("d");
- q.add("e");
- q.add("f");
- q.add("g");
- q.add("h");
- q.add("i");
- q.add("j");
- q.add("k");
- q.add("l");
- q.add("m");
- while( !q.isEmpty() ){
- String temp = q.remove();
- System.out.println(temp);
- }
- }
- }
队列的链表实现
- package com.kiritor;
- /**
- * 队列的链表实现
- * @author Kiritor
- * @param <T>*/
- public class LinkQueue<T> implements Queue<T> {
- private Node head;
- private Node rear;
- private int size;
- public LinkQueue() {
- head = null;
- rear = null;
- size = 0;
- }
- class Node
- {
- T data;
- Node next;
- public Node() {
- //无参构造
- }
- public Node(T t)
- {
- this.data = t;
- }
- }
- /**
- * 从队列的尾部插入结点*/
- @Override
- public void add(T t) {
- Node node = new Node(t);
- /*如果是队列则头部和尾部都执行Node*/
- if(isEmpty())
- head = node;
- else
- rear.next = node;
- rear = node;
- size++;//队列长度+1
- }
- /**
- * 从队列的头部删除
- * @return T*/
- @Override
- public T remove() {
- T tmp;
- if(isEmpty()){
- new NullPointerException("队列是空的!");
- tmp = null;
- }
- else
- {
- if(null==head.next )
- rear = null;
- tmp = head.data;
- head = head.next;
- size--;
- }
- return tmp;
- }
- @Override
- public int size() {
- return size;
- }
- @Override
- public boolean isEmpty() {
- return head == null;
- }
- /**
- * 查看队列头部,不做任何处理*/
- @Override
- public T front() {
- if(head !=null)
- return head.data;
- return null;
- }
- public static void main(String[] args) {
- LinkQueue<String> q = new LinkQueue<String>();
- q.add("a");
- q.add("b");
- q.add("c");
- q.add("d");
- q.add("e");
- q.add("f");
- q.add("g");
- q.add("h");
- q.add("i");
- q.add("j");
- q.add("k");
- q.add("l");
- q.add("m");
- System.out.println(q.size);
- while( !q.isEmpty() ){
- String temp = q.remove();
- System.out.println(temp);
- System.out.println(q.size());
- }
- }
- }
看下链队列的演示操作吧
队列的实现(JAVA)的更多相关文章
- 【阿里云产品公测】消息队列服务MQS java SDK 机器人应用初体验
[阿里云产品公测]消息队列服务MQS java SDK 机器人应用初体验 作者:阿里云用户啊里新人 初体验 之 测评环境 由于MQS支持外网访问,因此我在本地做了一些简单测试(可能有些业余),之后 ...
- 两个栈实现队列+两个队列实现栈----java
两个栈实现队列+两个队列实现栈----java 一.两个栈实现一个队列 思路:所有元素进stack1,然后所有出s ...
- HashMap的原理与实 无锁队列的实现Java HashMap的死循环 red black tree
http://www.cnblogs.com/fornever/archive/2011/12/02/2270692.html https://zh.wikipedia.org/wiki/%E7%BA ...
- java 栈和队列的模拟--java
栈的定义:栈是一种特殊的表这种表只在表头进行插入和删除操作.因此,表头对于栈来说具有特殊的意义,称为栈顶.相应地,表尾称为栈底.不含任何元素的栈称为空栈. 栈的逻辑结构:假设一个栈S中的元素为an,a ...
- 数据结构-队列(3)-使用Java内置队列
大多数流行语言都提供内置的队列库,因此您无需重新发明轮子. 如前所述,队列有两个重要的操作,入队 enqueue 和出队 dequeue. 此外,我们应该能够获得队列中的第一个元素,因为应该首先处理它 ...
- 队列的实现——java
同样实现方法有两种: 1. 数组的实现,可以存储任意类型的数据(略): 2. Java的 Collection集合 中自带的"队列"(LinkedList)的示例: import ...
- 算法笔记_080:蓝桥杯练习 队列操作(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 队列操作题.根据输入的操作命令,操作队列(1)入队.(2)出队并输出.(3)计算队中元素个数并输出. 输入格式 第一行一个数字N. 下面N行, ...
- LeetCode--255--用队列实现栈(java版)
使用队列实现栈的下列操作: push(x) -- 元素 x 入栈 pop() -- 移除栈顶元素 top() -- 获取栈顶元素 empty() -- 返回栈是否为空 注意: 你只能使用队列的基本操作 ...
- AQS源码深入分析之条件队列-你知道Java中的阻塞队列是如何实现的吗?
本文基于JDK-8u261源码分析 1 简介 因为CLH队列中的线程,什么线程获取到锁,什么线程进入队列排队,什么线程释放锁,这些都是不受我们控制的.所以条件队列的出现为我们提供了主动式地.只有满足指 ...
随机推荐
- string应用
今天在网上搜了一些资料. C# string类应用 判断是否包含子串 想要判断一个字符串中是否包含某个子串,可以用Contains方法来实现: ? public bool Contains (stri ...
- Golang在视频直播平台的高性能实践
http://toutiao.com/i6256894054273909249/ 熊猫 TV 是一家视频直播平台,先介绍下我们系统运行的环境,下面这 6 大服务只是我们几十个服务中的一部分,由于并发量 ...
- Find Minimum in Rotated Sorted Array问题的困惑
今天做了两题,第二题没解出来,发现太麻烦了,放弃了……明天脑子清楚的时候再做. 第一题就是标题中的这个问题.在一个旋转排序数组中找出最小的值. 针对该问题出了两道不同要求的题目,分别是不考虑重复元素的 ...
- [02] Oracle简单单行函数(字符+数值+日期+转换+通用)
1. 字符函数 --upper(str), lower(str):将str转换成大,小写 select upper('hello') as x1, lower('HELlo') as x2 from ...
- 11_关于SqlMapperConfig.xml
[简述] SqlMapConfig.xml是Mybatis的全局配置文件,配置内容如下: 1.properties---------属性 2.settings-----------全局配置参数 3.t ...
- Codevs 3287 货车运输 2013年NOIP全国联赛提高组(带权LCA+并查集+最大生成树)
3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description A 国有 n 座 ...
- 操作系统之进程篇(4)--经典进程间通信(IPC)问题
1. 哲学家进餐问题: 问题描述: 五个哲学家在一个圆桌上进餐,每人的面前放了一盘意大利面,两个盘子之间有一个叉子,但是由于盘子里面的面条十分光滑,需要两个叉子才能进行就餐行为.餐桌的布局如下图所示: ...
- 插入排序之python实现源码
def insert_sort(old): for i in range(1, len(old)): for j in range(i, 0, -1): if(old[j] < old[j-1] ...
- mysql主从 1050错误
在mysql从库上查询时出现如下错误 ...................... Last_Errno: 1050 Last_Error: Error 'Tab ...
- absolute独立使用之下拉框最佳实践
说明:传统的做法是给外部盒子relative定位,再给弹出框absolute定位,而这里我们将absolute独立使用 html <div class="searc ...