我有一个循环队列,应该实现第二次机会页面替换算法。所以,假设我有一个2D字符数组,如下所示:
QUEUE: [a, 0] [c, 0] [b, 0] [k, 0]
并且每个元素都包含一个char字符和一个额外的位。当我们想要将元素添加到存在的队列时,引用位应该从0变为1.如下所示:
// Adding char 'a' to queue below
QUEUE: [a, 1] [c, 0] [b, 0] [k, 0]
这给了第二次机会,以便在添加新元素时不删除该字符。程序应绕过第1位的元素,将其位更改为0(第二次机会)并将其添加到所需的索引中队列层次结构。当添加不存在的新元素时会出现问题。所以,我的代码基本上扫描队列数组并添加到第一个char值,它看到索引0并且它在大输入中产生问题,因为我松散了层次结构: / p>
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]
之后当我尝试添加let说'p'时,它会将其添加到'a',但是它应该将其添加到k。
答案 0 :(得分:1)
您解释的算法完全符合您的解释。 结果是您对该算法的期望。
但是你想要不同的东西。看起来您想要的是每次将1
更改为0
时,相应的队列条目都会移动到队列的末尾。
这可能是你的意思
并根据队列层次结构将其添加到所需的索引中
但在那种情况下你忘了真正做那部分。
我现在假设前面和后面是标记数组的第一个和最后一个索引的变量:
} 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--;
}
请记住,这段代码只是为了说明您必须做的事情,而不是经过测试的代码。
或者,如果前后实际上应该告诉你从哪里开始和结束(这是因为%
运算符而我假设的情况),你必须将前后设置为新的将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';
}
}
再次:请记住,这段代码只是为了说明你必须做什么,而不是经过测试的代码。 这假设前后都在数组边界内!