package testcase; import huawei.Demo; import junit.framework.TestCase; public class DemoTest extends TestCase { Demo oj = new Demo(); public void testCase01() { oj.CreateFreeQueue(10); assertEquals(0,oj.GetFreeIndex()); assertEquals(1,oj.GetFreeIndex()); oj.Destory(); } public void testCase02() { oj.CreateFreeQueue(10); for (int i = 0; i < 10; i++) { assertEquals(i, oj.GetFreeIndex()); } assertEquals(-1, oj.GetFreeIndex()); oj.FreeIndex(7); oj.FreeIndex(5); assertEquals(7, oj.GetFreeIndex()); oj.Destory(); } public void testCase03() { oj.CreateFreeQueue(10); for (int i = 0; i < 8; i++) { assertEquals(i, oj.GetFreeIndex()); } oj.FreeIndex(7); oj.FreeIndex(5); assertEquals(8, oj.GetFreeIndex()); assertEquals(9, oj.GetFreeIndex()); assertEquals(7, oj.GetFreeIndex()); oj.Destory(); } }
package huawei; public final class Demo { /* 有一个数组,使用时按照需要获得一个数组节点使用,使用完后,放回数组供下次使用。 节点的使用应该是循环的,也就是说总是选择释放时间最长的节点, 为了实现这个目的,通过一个循环队列来负责分配数组的空闲节点。 */ int Size; //空白队列的总长度 int Head; //FreeIndex的下标,指向队列头,即第一个空闲节点。 int Len; //当前空白元素的个数 int FreeIndex[]; //保存空闲节点的下标。根据数组大小申请动态内存 //请实现如下函数: /* 功能: 初始化,完成内存申请等操作 输入: 数组长度 返回: 无 */ public void CreateFreeQueue(int size) { FreeIndex = new int[size]; Size = size; } /* 功能: 获取一个空闲的节点 返回: 初始时按数组顺序从大到小分配,所有节点都用过之后,有空闲节点则返回最早释放的节点,否则返回-1 */ public int GetFreeIndex() { if (Head == Size) { return -1; } //使用 Head++; FreeIndex[Head - 1] = Head; return Head - 1; } /* 功能: 数组节点使用完后释放,放到队列尾部 输入: pQueue; Index: 调用者保证非负 返回: 无 */ public void FreeIndex(int Index) { //将Index压底 for (int i = Index; i < Size - 1; i++) { FreeIndex[i] = FreeIndex[i] + FreeIndex[i + 1]; FreeIndex[i + 1] = FreeIndex[i] - FreeIndex[i + 1]; FreeIndex[i] = FreeIndex[i] - FreeIndex[i + 1]; } FreeIndex[Size - 1] = 0; } /* 功能: 清空申请的动态内存 返回: 无 */ public void Destory() { FreeIndex = null; Head = 0; Size = 0; Len = 0; } }
package nanoha.oj.freequeue; public final class FreeQueue { /* * 有一个数组,使用时按照需要获得一个数组节点使用,使用完后,放回数组供下次使用。 节点的使用应该是循环的,也就是说总是选择释放时间最长的节点, * 为了实现这个目的,通过一个循环队列来负责分配数组的空闲节点。 */ int Size; // 空白队列的总长度 int Head; // FreeIndex的下标,指向队列头,即第一个空闲节点。 int Len; // 当前空白元素的个数 int FreeIndex[]; // 保存空闲节点的下标。根据数组大小申请动态内存 // 请实现如下函数: /* * 功能: 初始化,完成内存申请等操作 输入: 数组长度 返回: 无 */ public void CreateFreeQueue(int size) { FreeIndex = new int[size]; Size = size; Len = size; for (int i = 0; i < FreeIndex.length; i++) { FreeIndex[i] = i; System.err.print(i + " "); } System.err.println(); } /* * 功能: 获取一个空闲的节点 返回: 初始时按数组顺序从大到小分配,所有节点都用过之后,有空闲节点则返回最早释放的节点,否则返回-1 */ public int GetFreeIndex() { if (Head == Size) { return -1; } // 使用 int i = FreeIndex[Head]; Head++; Len--; return i; } /* * 功能: 数组节点使用完后释放,放到队列尾部 输入: pQueue; Index: 调用者保证非负 返回: 无 */ public void FreeIndex(int Index) { // 将Index压底 for (int i = Index; i < Size - 1; i++) { FreeIndex[i] = FreeIndex[i] + FreeIndex[i + 1]; FreeIndex[i + 1] = FreeIndex[i] - FreeIndex[i + 1]; FreeIndex[i] = FreeIndex[i] - FreeIndex[i + 1]; } for (int i : FreeIndex) { System.err.print(i + " "); } System.err.println(); // 重置指针 if (Len == 0) { Head = Index + 1; } else { Head = Size - Len - 1; } if (Len < Size) { Len++; } System.err.println("h" + Head); } public static void main(String[] args) { FreeQueue oj = new FreeQueue(); oj.CreateFreeQueue(10); for (int i = 0; i < 8; i++) { oj.GetFreeIndex(); } oj.FreeIndex(7); oj.FreeIndex(5); System.err.println("gi " + oj.GetFreeIndex()); System.err.println("gi " + oj.GetFreeIndex()); System.err.println("gi " + oj.GetFreeIndex()); } /* * 功能: 清空申请的动态内存 返回: 无 */ public void Destory() { FreeIndex = null; Head = 0; Size = 0; Len = 0; } }