基于数组和链表的队列实现
来源:互联网 发布:淘宝怎么样才不算盗图 编辑:程序博客网 时间:2024/05/26 12:04
队列接口定义,和栈接口一样:
public interface Queue<Item> {/** * 添加一个元素 * @param item */public void push(Item item);/** * 获取最后一个添加的元素,并将其从队列中删除 * @return */public Item pop();/** * 判断队列是否为空 * @return */public boolean isEmpty();/** * 获取队列当前的元素个数 * @return */public int size();}
基于数组的实现,关键是如何resize:
import java.util.Iterator;import com.mycode.algorithms.stack.Stack;/** * 基于数组的队列实现 * @author imhuqiao */public class ArrayQueue<Item> implements Queue<Item>,Iterable<Item> {private Item[] data = null;private int tail = -1;private int head = -1;private int count = 0;public ArrayQueue(){this(10);}public ArrayQueue(int initLength){data = (Item[]) new Object[initLength];}@Overridepublic void push(Item item) {if(size()==data.length){resize(data.length*2);}data[++tail] = item;if(head==-1){head = 0;}count++;print();}@Overridepublic Item pop() {if(isEmpty()){return null;}Item item = data[head];data[head] = null;head++;if(size() > 0 && size() == data.length/4) resize(data.length/2);print();count--;return item;}private void print(){System.out.print("[");for(Item d : data){System.out.print(d+",");}System.out.println("],tial="+tail+",head="+head);}@Overridepublic boolean isEmpty() {return size()==0;}@Overridepublic int size() {return count;}@Overridepublic Iterator<Item> iterator() {return new ArrayStackIterator();}private void resize(int length){Item[] newdata = (Item[]) new Object[length];int x = 0;//System.out.println("resize from "+ size()+" to "+length);for(int i = head;i<=tail;i++){newdata[x++] = data[i];data[i] = null;}data = newdata;head = 0;tail = x==0 ? x : x-1;}class ArrayStackIterator implements Iterator<Item>{private int i = tail;private int j = head;@Overridepublic boolean hasNext() {return i>=j;}@Overridepublic Item next() {Item result = data[j++];return result;}@Overridepublic void remove() {}}}
import java.util.Iterator;import com.mycode.algorithms.stack.Stack;/** * 基于数组的队列实现 * @author imhuqiao */public class ArrayQueue<Item> implements Queue<Item>,Iterable<Item> {private Item[] data = null;private int tail = -1;private int head = -1;private int count = 0;public ArrayQueue(){this(10);}public ArrayQueue(int initLength){data = (Item[]) new Object[initLength];}@Overridepublic void push(Item item) {if(size()==data.length){resize(data.length*2);}data[++tail] = item;if(head==-1){head = 0;}count++;print();}@Overridepublic Item pop() {if(isEmpty()){return null;}Item item = data[head];data[head] = null;head++;if(size() > 0 && size() == data.length/4) resize(data.length/2);print();count--;return item;}private void print(){System.out.print("[");for(Item d : data){System.out.print(d+",");}System.out.println("],tial="+tail+",head="+head);}@Overridepublic boolean isEmpty() {return size()==0;}@Overridepublic int size() {return count;}@Overridepublic Iterator<Item> iterator() {return new ArrayStackIterator();}private void resize(int length){Item[] newdata = (Item[]) new Object[length];int x = 0;//System.out.println("resize from "+ size()+" to "+length);for(int i = head;i<=tail;i++){newdata[x++] = data[i];data[i] = null;}data = newdata;head = 0;tail = x==0 ? x : x-1;}class ArrayStackIterator implements Iterator<Item>{private int i = tail;private int j = head;@Overridepublic boolean hasNext() {return i>=j;}@Overridepublic Item next() {Item result = data[j++];return result;}@Overridepublic void remove() {}}}
测试代码:
@Testpublic void testArrayQueue(){Queue<String> as = new ArrayQueue<String>(1);as.push("a");as.push("b");as.push("c");as.push("d"); as.push("e");Assert.assertEquals("a",as.pop());Assert.assertEquals("b",as.pop());String res = "";for(String str : as){res += str;}Assert.assertEquals("cde",res);}
@Testpublic void testLinkQueue(){Queue<String> as = new LinkQueue<String>();as.push("a");as.push("b");as.push("c");as.push("d"); as.push("e");Assert.assertEquals("a",as.pop());Assert.assertEquals("b",as.pop());String res = "";for(String str : as){res += str;}Assert.assertEquals("cde",res);}
0 0
- 基于数组和链表的队列实现
- 队列的数组和链表实现
- 队列基于链表和数组的实现方法(java)
- 基于数组的队列实现
- 基于数组的队列实现
- 基于数组的循环队列和基于链表的队列
- 基于数组和节点方式的队列的实现
- 基于链表、数组实现队列、循环队列
- 基于数组的队列实现(C语言)
- java 基于数组实现的队列
- 简单队列的实现(基于数组)
- 基于动态数组的队列实现
- FIFO 队列的链表和数组实现
- 队列的两种实现:数组和链表
- FIFO 队列的链表和数组实现
- FIFO 队列的链表和数组实现
- 队列01:数组和链表实现
- java 实现数组队列和链表队列
- POJ1003_Hangover(二分求上界)
- Jython的安装及简单例子
- 吝啬的国度(DFS)
- JDK支持的字符集
- Ubuntu 关机、重启、注销 命令
- 基于数组和链表的队列实现
- unity 打包资源及网络请求资源包
- 企鹅的封包拦截器, 只是技术研究爱好
- SFINAE使用
- C++ 内联inline
- QT中文显示问题
- Unity中物体的遮挡和显隐效果
- Cocos2d-x3.0 不规则Button
- 行转列