基于数组和链表的队列实现

来源:互联网 发布:淘宝怎么样才不算盗图 编辑:程序博客网 时间: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() {}}}


基于链表的实现,原理和栈一致,只是多了一个记录尾部的变量,push的时候不是替换头而是接在尾巴上:

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
原创粉丝点击