一道题

循环队列管理机制
本文介绍了一种利用循环队列管理数组节点的方法,确保节点的循环使用,详细讲解了节点的分配、回收及队列的初始化与销毁过程。
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;
    }

}

 

转载于:https://www.cnblogs.com/nayyang/p/3977667.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值