Java 队列页面替换

标签 java queue

我有一个循环队列,它应该实现第二次机会页面替换算法。所以,假设我有一个 2D 字符数组,如下所示:

QUEUE: [a, 0] [c, 0] [b, 0] [k, 0] 

每个元素都包含一个字符和一个额外的位。当我们想要将元素添加到存在的队列时,引用位应该从0更改为1。如下所示:

// Adding char 'a' to queue below
QUEUE: [a, 1] [c, 0] [b, 0] [k, 0] 

这提供了第二次机会,以便在应添加新元素时不删除该字符。程序应绕过位为 1 的元素,将其位更改为 0(第二次机会)并将其添加到所需的索引中队列层次结构。添加不存在的新元素时会出现问题。因此,我的代码基本上扫描队列数组并添加到第一个字符值,它看到索引 0,并且在大输入中产生问题,因为我松散层次结构:

public char replace(char c) {
        char tmp = 0; // If nothing is replaced returns 0
        if (isempty()) {
            throw new IllegalStateException("Queue is empty, cant dequeue");
        } else if (this.front == this.rear) {
            front = -1;
            rear = -1;
            numOfelements--;
        } else {
            for(int i = front; i <= rear; i = (i+1)%size ){
                if(queue[i][1] == '0'){
                    tmp = queue[i][0];
                    queue[i][0] = c;
                    break;
                } else {
                    queue[i][1] = '0';
                }
            }
        }
        return tmp;  
    }

例如:假设我们将“b”添加到下面的队列中:

QUEUE: [a, 1] [c, 1] [b, 0] [k, 0] 

当我添加“d”时,它变成这样:

 QUEUE: [a, 0] [c, 0] [d, 0] [k, 0]

之后,当我尝试添加“p”时,它会将其添加到“a”,但它应该将其添加到 k。

最佳答案

您解释的算法完全按照您解释的方式执行。 结果就是您对该算法的期望。

但是你想要一些不同的东西。看来您想要的是每次将 1 更改为 0 时,相应的队列条目都会移至队列末尾。

这可能就是你的意思

and add it into the needed index according to queue hierarchy

但在这种情况下,您忘记了实际执行该部分。

我现在假设 front 和 after 是标记数组的第一个和最后一个索引的变量:

} else {
    char currentChar = queue[i][0];
    for (int j = i; j < rear; j++) {
        queue[j][0] = queue[j+1][0];
        queue[j][1] = queue[j+1][1];
    }
    queue[rear][0] = currentChar;
    queue[rear][1] = '0';
    i--;
}

请记住,这段代码只是为了说明您必须执行的操作,并且不是经过测试的代码。

<小时/>

或者,如果 front 和 back 实际上应该告诉你从哪里开始和结束(我认为由于 % 运算符就是这种情况),那么你必须设置 front 和将 char 分配到某处后,将后置为新值。但是,如果应该是这样,这将使您的 for 循环无效,因为您实际上可能会比后部更高的位置开始,并且不希望 for 停止。

它应该看起来像这样:

for(int i = front; i != rear; i = (i+1)%size ){
    if(queue[i][1] == '0'){
        tmp = queue[i][0];
        queue[i][0] = c;
        front = (i+1) % size;
        rear = i;
        break;
    } else {
        queue[i][1] = '0';
    }
}

再次强调:请记住这段代码只是为了说明您必须做什么,并且不是经过测试的代码。 这假设前部和后部都在数组边界内!

关于Java 队列页面替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49651959/

相关文章:

java - 日期对象转换为 (mm/dd/yyyy) 中的日期对象

java - 如何使用 JDBC 从远程计算机访问 WAMP 数据库?

java - 获取 JAXB IllegalAnnotationExceptions 准备 UnMarshal

C指针恶作剧

python - 要求另一个线程做某事

java - 访问 H2 数据库架构

java - 我怎样才能杀死 Android 上的整个应用程序?

javascript - 在 Javascript 中排队并停止将点击事件传播到 div 内部

c++ - 在 while 循环内的变量中分配新内存

c++ - for循环只循环3次