队列
用惯了数组的同学可能会思考一个问题:“有没有比数组更方便的方法,可以任意添加元素,而不浪费空间,相信许多学过C++的同学会立马知道,动态数组,然而java没有指针,所以也就没有动态数组,这时候怎么办呢?对了,队列,java中的神器,听起来十分高大上,然而学了它的人都知道,它不过是数组的拓展,实现起来非常简单,虽然java中实际上是有系统定义的ArrayList,可以直接实现,加入元素,删除,等多种功能,但是为了真正理解以及运用队列,下面是队列实现的代码,以及方法:
步骤:
数组队列的实现步骤
1.定义一个接口,在接口中定义抽象方法。
2.定义一个类,实现接口,重写接口中的抽象方法。
3.在类中定义一个原始数组和数组的元素总数属性。
4.实现添加元素的方法
以下是接口代码:
import java.util.Collection; public interface ArrayList<E> extends Collection<E>{ public boolean add(E e);//定义添加数据的方法 public boolean remove(int index);//定义删除数据的方法 public int getsize();//获取队列长度 public E gete(int index);//获取指定索引位置的元素 public void clear(); // 移除此列表中的所有元素 public int indexOf(Object o); // 返回此列表中首次出现的指定元素的索引,或如果此列表不包含元素,则返回 -1。 public boolean isEmpty(); // 如果此列表中没有元素,则返回 true public int lastIndexOf(Object o); //返回此列表中最后一次出现的指定元素的索引,或如果此列表不包含索引,则返回 -1。 public boolean remove(Object o); // 移除此列表中首次出现的指定元素(如果存在)。 public E set(int index, E element); //用指定的元素替代此列表中指定位置上的元素。 public void print(); //打印数组 public boolean addAll(Collection c); }
重点:我们在另一个类中继承接口,实现其所有抽象方法,这一段十分重要,能深刻理解队列实现原理
代码如下:
import java.util.Collection; import java.util.Iterator; public class ArrayFunction<E> implements ArrayList{ public Object[] array; public int size=0; public ArrayFunction(){ array=new Object[10]; } //定义添加元素的方法 public boolean add(Object e) { Object newarray[]=new Object[size+1];//定义一个新数组长度是原数组加1 //遍历将旧数组的值赋给新数组 for(int i=0;i<size;i++){ newarray[i]=array[i]; } //将最后一个加入的元素加到新数组最后一个 newarray[size]=e; size++; array=newarray; //交换地址 return true; } //定义移除指定位置的元素方法 public boolean remove(int index) { Object newarray[]=new Object[size-1];//定义新数组元素长度比原来少一 //判断是否越界 if(index<0&&index>size){ return false; } else{ for(int i=0;i<index;i++){ newarray[i]=array[i]; } for(int i=index+1;i<size;i++){ newarray[i-1]=array[i]; } } size--; array=newarray; return true; } public boolean addAll(Collection c) { int length=c.size(); Object [] newarray=new Object[size+length];//创建一个新数组 if(length!=0) { //循环遍历数组 for(int i=0;i<size;i++) { newarray[i]=array[i]; } for(int i=0;i<length;i++) { Iterator it=c.iterator(); if(it.hasNext()){ newarray[size+i]=it.next(); } } array=newarray;//交换地址 return true; } else { return false; } } //得到数组长度 public int getsize() { // TODO Auto-generated method stub return size; } //得到指定位置的数组元素 public E gete(int index) { return (E) array[index]; } //清除功能,本来想将array中所有元素全部赋值为null,考虑到String类型不同,因此使用下面方法 public void clear() { Object[] newarray=new Object[size]; array=newarray; } // 返回此列表中首次出现的指定元素的索引,或如果此列表不包含元素,则返回 -1。 public int indexOf(Object o) { for(int i=0;i<size;i++){ if(array[i]==o){ return i; } } return -1; } //判断数组是否为空 public boolean isEmpty() { for(int i=0;i<size;i++){ if(array[i]!=null){ return true; } } return false; } //检索元素最后一次出现的地点,或如果此列表不包含元素,则返回 -1。 public int lastIndexOf(Object o) { int last=0,cout=0; for(int i=0;i<size;i++){ if(array[i]==o){ last=i; cout++; } } if(cout!=0) return last; else return -1; } // 移除此列表中首次出现的指定元素(如果存在)。 public boolean remove(Object o) { Object newarray[]=new Object[size-1]; for(int i=0;i<size;i++){ if(array[i]==o){ remove(i);//嵌套使用 return true; } } return false; } @Override public Object set(int index, Object element) { array[index]=element; return null; } @Override public void print() { System.out.println(""); for (int i = 0; i <size; i++) { System.out.print(array[i]+"\t"); } } @Override public int size() { // TODO Auto-generated method stub return 0; } @Override public boolean contains(Object o) { // TODO Auto-generated method stub return false; } @Override public Iterator iterator() { // TODO Auto-generated method stub return null; } @Override public Object[] toArray() { // TODO Auto-generated method stub return null; } @Override public Object[] toArray(Object[] a) { // TODO Auto-generated method stub return null; } @Override public boolean containsAll(Collection c) { // TODO Auto-generated method stub return false; } @Override public boolean removeAll(Collection c) { // TODO Auto-generated method stub return false; } @Override public boolean retainAll(Collection c) { // TODO Auto-generated method stub return false; } }
之后,就是定义数组去实现验证以上的代码效果了。我们在建立一个Arrayset类去实现
import java.util.Collection; import java.util.List; public class Arrayset { public static void main(String[] args) { // 实例化一个数组队列对象。 ArrayList a = new ArrayFunction(); a.add("依依");// 向队列中添加元素 for (int i = 0; i < 10; i++) { a.add(i);//调用添加元素的方法 } a.print();//打印数组 a.add(new ArrayFunction());//设置数组长度 Collection b = new ArrayFunction(); b.add("343"); a.addAll(b); //调用删除的方法 a.remove(5); // 输出信息 a.print(); a.getsize(); System.out.println(a.getsize()); a.gete(3); System.out.println(a.gete(3)); a.indexOf("依依"); System.out.println(a.indexOf("依依")); a.lastIndexOf(7); System.out.println(a.lastIndexOf(7)); a.isEmpty(); System.out.println( a.isEmpty()); a.set(2,"LOVE"); a.print(); a.clear(); a.print(); } }
相关推荐
NULL 博文链接:https://128kj.iteye.com/blog/1665616
基于JAVA实现的常用数据结构代码,JAVA实现复杂度、动态数组、链表、栈、队列、二叉搜索树等
NULL 博文链接:https://128kj.iteye.com/blog/1624362
java实现队列(数组结构)(csdn)————程序
Java版数据结构代码,最好解压后直接导入到eclipse中,因为有些代码间有关联关系。其中栈结构中的压栈方法中包含了动态数组的实现方法,没有单写了,在队列的代码中,引用了链表的代码
1) 初始化含有20个英文名字的数组; 2) 排序:以a-z,A-Z的升序顺序; 3) 输入任意一个名字并能将其插入到合适的位置。
java数组实现循环队列。包括入队, 出队,输出队列。 队列先入先出。
2)若尾指针rear小于队列的最大下标maxSize-1,则将数据存入rear所指的数中组元素中,否则无法存入数据。rear==maxSize-1[队列满] 环形队列 1)front变量的含义做一个调整:front就指向队列的第一个元素,也就是说...
Java-用数组实现栈-队列-线性列表(最详细) 有注释 适合java新生 进行数组的练习 3个数据结构的数组实现练习
java 算法:包括数组,哈希表,队列,栈,链表(双端,单向,双向),二叉树(普通二叉树,哈夫曼树,二叉查找树,平衡二叉树,二叉线索树),图这些数据结构的实现以及多种排序算法和其他一些算法的实现(递归,二...
NULL 博文链接:https://shxin.iteye.com/blog/1948849
队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,只允许在表的后端(rear)进行插入操作,下面介绍一下java使用数组和链表实现队列的示例
java双端队列的实现-Java实现自定义双端队列(链表和数组两种方式) 数组和链表.pdf
约瑟夫生死游戏 常见于队列的练习 属于经典算法
腾讯的Java面试题 TCP和UDP的区别,TCP为什么是三次握手,不是两次。 答:1、因为tcp是全双工协议,区别在于前者可靠,后者...前者是数组队列,相当于动态数组;后者为双向链表结构,也可当作堆栈、队列、双端队列 ②当
用java语言中的数组来实现队列,其中扩容方法为在原数组的基础上乘以2,另外也测试了用java中Vector类实现队列。
下面小编就为大家分享一篇基于Java数组实现循环队列的两种方法小结,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
设以数组se[m]存放循环队列的元素,同时设变量rear 和front分别作为队头队尾指针,且队头指针指向队头前一个位置,写出这样设计的循环队列入队和出队算法。