@

和栈一样,队列也是表,但是使用队列的特点是先进先出。

队列模型

$\color{black}{队列的基本操作是入队,它是在表的末端插入一个元素,和出队,它是删除在表开头的一个元素}$

graph LR
A[<kbd>入队</kbd>] --> b[队列]
b[队列] --> c[<kbd>出队</kbd>]

队列的循环数组实现

  • 实现队列的类
import java.util.Arrays;

/**
* @author 李正阳
* @param <E> 泛型存储类型
*/
public class MyArrayQueue<E> implements queue<E> {
/**
* @param rear 队尾
* @param front 队头
* @param size 数组中现在有多少个元素
* @param MAX_CAPATIAL 数组的总大小
* @param array 存储元素的数组
*/
private int rear;
private int front;
private int size;
private final int MAX_CAPATIAL=10;
private Object[] array; /**
* 构造方法 初始化数组和相关的值
*/
public MyArrayQueue(){
array=new Object[MAX_CAPATIAL];
rear=0;
front=0;
size=0;
} /**
* 入队方法
* 先给size遍历加一,如果队列满了,就给size变量减一
* 若队列未满就给队尾加一赋值
* @param p 需要入队的元素
* @return true 成功入队 false 入队失败
*/
@Override
public boolean push(Object p) {
size++;
if(isFull()){
System.out.println("队列满了");
size--;
return false;
}else{
if(rear>=MAX_CAPATIAL){
rear=0;
array[rear++]=p;
}else{
array[rear++]=p;
}
}
return true;
} /**
* 出队方法
* 先判空再出队
* @return 出队的泛型类型的元素
*/
@Override
public E pop() {
size--;
E temp=(E) array[front];
if(isEmpty()){
System.out.println("队列为空");
}else{
front++;
if(front>MAX_CAPATIAL){
front=0;
}
}
return temp;
} /**
* 表的长度
* @return 表中有多少哥元素
*/
@Override
public int size() {
return size;
} /**
* 从表头到表尾输出表中的元素
*/
@Override
public void travel() {
int i=front; while (true){
System.out.print(array[i++]+" ");
if(i==MAX_CAPATIAL){
i=0;
}
if(i==rear){
break;
}
}
System.out.println();
} /**
* 判断表是否为空
* @return true 表为空 false 表不为空
*/
@Override
public boolean isEmpty() {
if(size==0){ return true;
}else{
return false;
}
} /**
* @return 返回队尾元素
*/
@Override
public E getRear() {
return (E) array[rear];
}
/**
* @return 返回队头元素
*/
@Override
public E getFront() {
return (E)array[front];
} /**
* 判断表是否满了
* @return true 队列满了 false 队列未满
*/
private boolean isFull(){
if(size>MAX_CAPATIAL){
return true;
}else{
return false;
}
} }
  • 实现接口文件
/**
* 队列的接口
* @param <E> 泛型类型
*/
public interface queue<E> {
/**
* 入队方法
* @param p
* @return
*/
boolean push(E p); /**
* 出队方法
* @return 返回泛型类型的方法
*/
E pop(); /**
* 表中元素的大小
* @return
*/
int size(); /**
* 输出表中元素
*/
void travel(); /**
* 判断表是否为空的
* @return true 表是空的 false 表是非空
*/
boolean isEmpty(); /**
* 获取表尾元素
* @return 表尾的元素
*/
E getRear(); /**
* 获取表头的元素
* @return 表头的元素
*/
E getFront();
}

数据结构java学习(三)循环队列的更多相关文章

  1. JavaScript数据结构与算法(四) 循环队列的实现

    实现击鼓传花,需要用到上一章所述队列类Queue TypeScript方式实现源码 let hotPotato = (nameList, num) => { let queue = new Qu ...

  2. Java数组实现循环队列的两种方法

    用java实现循环队列的方法: 1.添加一个属性size用来记录眼下的元素个数. 目的是当head=rear的时候.通过size=0还是size=数组长度.来区分队列为空,或者队列已满. 2.数组中仅 ...

  3. 《java学习三》并发编程 -------线程池原理剖析

    阻塞队列与非阻塞队 阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞.试图从空的阻塞队列中获取元素的线程将会被阻塞,直到 ...

  4. 《java学习三》jvm性能优化-------调优

    常见参数配置 -XX:+PrintGC      每次触发GC的时候打印相关日志 -XX:+UseSerialGC      串行回收 -XX:+PrintGCDetails  更详细的GC日志 -X ...

  5. Java学习笔记--循环总结

    关键字break和continue除了在switch语句中使用break,还可以在一个循环中使用break立即终止该循环. 循环语句有三类: while循环, do-while循环和for循环.循环中 ...

  6. JAVA学习<三>

    1.Java中运算符的优先级: 2.条件语句If: 如果 if 条件成立时的执行语句只有一条,是可以省略大括号滴!但如果执行语句有多条,那么大括号就是不可或缺的. public class Hello ...

  7. 《java学习三》jvm性能优化------jconsul

    利用jconsul检测线程死锁,    死锁的线程,会有   已锁定    三个字 visualVm                       也在jdk里 VisualVM 是一款免费的,集成了多 ...

  8. java学习:循环结构的使用规则和注意事项

    循环结构的基本组成部分,一般可分为四部分: 初始化语句:在循环开始最初执行,而且只做唯一一次 条件判断:如果成立,则循环继续:如果不成立,则循环退出. 循环体:重复要做的事情内容,若干行语句. 进步语 ...

  9. Java学习—— for循环

    For双重循环 /* 循环语句嵌套 */ class ForForTest { public static void main(String[] args) { /*int x,y = 0; for( ...

随机推荐

  1. 类型:NodeJs;问题:默认IE的编码为utf8;结果:IE不能自动选择UTF-8编码解决办法

    在Windows操作系统上使用IE作为浏览器时.常常会发生这样的问题:在浏览使用UTF-8编码的网页时,浏览器无法自动侦测(即没有设定“自动选 择”编码格式时)该页面所用的编码.即使网页已经声明过编码 ...

  2. 安卓SQLite数据库操作(下)

    在安卓开发中,数据库的操作无非就是增删改查.那么,这里我们通过例子来学习这四个操作. 我们先看代码吧.具体讲解后面说. 布局文件 activity_main.xml <LinearLayout ...

  3. 第5章 使用MUI与H5+构建移动端app

    H5+是JS封装的工具集合,通过H5+我们就可以使用JS的方式去调用到我们手机端上的一些原生的组件. http://dev.dcloud.net.cn/mui/ http://dev.dcloud.n ...

  4. Nginx 正向代理和反向代理

    正向代理的概念 正向代理,也就是传说中的代理,他的工作原理就像一个跳板,简单的说,我是一个用户,我访问不了某网站,但是我能访问一个代理服务器这个代理服务器呢,他能访问那个我不能访问的网站于是我先连上代 ...

  5. php中定义数组的方法

    1.PHP定义数组的格式 数组名=array(); 如:$aa=array();//这样就定义了一个数组, 之后给元素赋值: $aa[0]="9016"; $aa[1]=" ...

  6. easyui layout 折叠之后显示标题

    方法一:重载扩展panel收缩事件 (function($){ var buttonDir = {north:'down',south:'up',east:'left',west:'right'}; ...

  7. IOS UITableView分组与索引分区实例

    #import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplicationDelegate> @pr ...

  8. DPDK内存管理-----rte_mbuf(转)

    本文主要介绍rte_mbuf与rte_mempool数据结构之间的组织关系.以及网卡接收到的数据是如何存储在rte_mbuf中的. 一.rte_mbuf.rte_mempool及网卡收到的数据包在内存 ...

  9. 移动应用中的AR开发,5款最受欢迎工具推荐!

      英文原文:Top 5 Tools for Augmented Reality in Mobile Apps 还记得前段时间在网上很火的 3D 小熊不?托它的福,为相当一部分人科普了增强现实(AR) ...

  10. python--爬虫基础

    http://files.cnblogs.com/files/Kobe10/Python__%E7%88%AC%E8%99%AB%E5%9F%BA%E7%A1%80.pdf