算法(第四版)队列 能够动态调整数组大小的实现--参照原书栈的实现

zhb888999 2017-10-08 01:00:21
新手学习阶段,望大家批评指正
import java.util.Iterator;
import edu.princeton.cs.algs4.*;

public class MyQueue<Item> implements Iterable<Item>
{
private Item[] a = (Item[]) new Object[1];
private int HEAD;
private int TAIL;

public void enqueue(Item item)
{
if (a[TAIL] != null) addsize(2*a.length);
if (TAIL == (a.length -1)) { a[TAIL] = item; TAIL = 0; }
else { a[TAIL] = item; TAIL ++ ; }
}

public Item dequeue()
{
Item item = a[HEAD];
a[HEAD] = null;
if (HEAD == (a.length - 1)) HEAD = 0;
else HEAD ++ ;
if (size() == a.length/4) subsize(a.length/2);
return item;
}

public boolean isEmpty()
{
return a[HEAD] == null;
}

public int size()
{
if (a[HEAD] == null) return 0;
if (TAIL <= HEAD) return TAIL + a.length - HEAD;
else return TAIL - HEAD;
}

private void addsize(int max)
{ //将大小为队列大小为size() <= man 的队列移动到一个新的大小为max的数组中
Item[] temp = (Item[]) new Object[max];
for (int i = 0; i < (a.length - HEAD); i++) temp[i] = a[HEAD + i];
for (int i = 0; i < TAIL; i++) temp[(a.length - HEAD) + i] = a [i];
HEAD = 0;
TAIL = a.length;
a = temp;
}

private void subsize(int min)
{ //将队列大小为size() <= min 的队列移动到一个新的大小为min的数组中
Item[] temp = (Item[]) new Object[min];
if (HEAD < TAIL)
{
for (int i = 0; i < TAIL - HEAD; i++) temp[i] = a[HEAD + i];
TAIL = TAIL - HEAD;
HEAD = 0;
a = temp;
} else if (HEAD > TAIL)
{
for (int i = 0; i < (a.length - HEAD); i++) temp[i] = a[HEAD + i];
for (int i = 0; i < TAIL; i++) temp[(a.length - HEAD) + i] = a [i];
TAIL = a.length - HEAD - TAIL;
HEAD = 0;
a = temp;
} else {
HEAD = 0;
TAIL = 0;
a = temp;
}
}

public Iterator<Item> iterator()
{
return new MyQueueIterator();
}

public class MyQueueIterator implements Iterator<Item>
{
private int i = HEAD;
public boolean pnext = true;
public boolean hasNext()
{
return pnext;
}
public Item next()
{ Item next;
if (a[i] != null)
{
next = a[i];
i++;
if(i < a.length && a[i] == null) pnext = false;
if(i == a.length) {i = 0;if (a[0] == null) pnext = false;}
if(i == HEAD ) {pnext = false;}
return next;
}
else
{
pnext = false;
return null;
}
}
public void remove() { }
}

public static void main(String[] args)
{
MyQueue<String> q;
q = new MyQueue<String>();
while (!StdIn.isEmpty())
{
String item = StdIn.readString();
if (!item.equals("-"))
q.enqueue(item);
else if (!q.isEmpty()) StdOut.print(q.dequeue() + " ");
}
StdOut.println("(" + q.size() + " left on queue)");
StdOut.print("HEAD="+q.HEAD+" "+"TAIL="+q.TAIL+"\n");

for (String s : q)
StdOut.print(s+" ");
}
}
...全文
128 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

23,407

社区成员

发帖
与我相关
我的任务
社区描述
Java 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧