Java队列页面替换

时间:2018-04-04 13:11:44

标签: java queue

我有一个循环队列,应该实现第二次机会页面替换算法。所以,假设我有一个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。

1 个答案:

答案 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';
    }
}

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