Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 需要帮助理解CTC书籍答案吗_Java_Algorithm_Stack - Fatal编程技术网

Java 需要帮助理解CTC书籍答案吗

Java 需要帮助理解CTC书籍答案吗,java,algorithm,stack,Java,Algorithm,Stack,这来自“破解编码面试”: 问题: 描述如何使用单个阵列实现三个堆栈 答复: 在这种方法中,只要阵列中有任何可用空间,任何堆栈都可以增长 我们依次为堆栈分配空间,并将新块链接到上一个块这意味着堆栈中的任何新元素都会保留指向该特定堆栈上一个顶部元素的指针 在这个实现中,我们面临一个未使用空间的问题,例如,如果堆栈删除了它的一些元素,那么被删除的元素可能不一定出现在ar射线的末尾,因此,在这种情况下,我们将无法使用这些新释放的空间 为了克服这一缺陷,我们可以维护一个自由列表,并且每次插入时,整个数组空

这来自“破解编码面试”: 问题:

描述如何使用单个阵列实现三个堆栈 答复: 在这种方法中,只要阵列中有任何可用空间,任何堆栈都可以增长 我们依次为堆栈分配空间,并将新块链接到上一个块这意味着堆栈中的任何新元素都会保留指向该特定堆栈上一个顶部元素的指针 在这个实现中,我们面临一个未使用空间的问题,例如,如果堆栈删除了它的一些元素,那么被删除的元素可能不一定出现在ar射线的末尾,因此,在这种情况下,我们将无法使用这些新释放的空间 为了克服这一缺陷,我们可以维护一个自由列表,并且每次插入时,整个数组空间将首先分配给自由列表,如果删除,我们将从自由列表中删除一个条目,我们只需将自由单元格的索引添加到自由列表中 在此实现中,我们将能够在可变空间利用率方面具有可行性,但我们需要增加空间复杂性。 答案和代码:

{
     int stackSize = 300;
     int indexUsed = 0;
     int[] stackPointer = {-1,-1,-1};
     StackNode[] buffer = new StackNode[stackSize * 3];

    void push(int stackNum, int value) {     
    int lastIndex = stackPointer[stackNum];
    stackPointer[stackNum] = indexUsed;
    indexUsed++;
    buffer[stackPointer[stackNum]]=new StackNode(lastIndex,value);
    }

    int pop(int stackNum) {
    int value = buffer[stackPointer[stackNum]].value;
    int lastIndex = stackPointer[stackNum];
    stackPointer[stackNum] = buffer[stackPointer[stackNum]].previous;
    buffer[lastIndex] = null;
    indexUsed--;
    return value;
    }

    int peek(int stack) { return buffer[stackPointer[stack]].value; }
    boolean isEmpty(int stackNum) { return stackPointer[stackNum] == -1; }

 class StackNode {
 public int previous;
 public int value;
 public StackNode(int p, int v){
 value = v;
 previous = p;
 }
}
所以,在开始时,我想说我来自C++,如果它是一些简单的java技巧或者我不知道的java,那么无论如何都会学到一些新东西。 问题是,当我们试图通过简单地将数组中的堆栈元素链接到每个堆栈的上一个顶部el来解决它时,我们将弹出一些元素,我们的数组将变得碎片化,如果这些元素不在列表的前面,将无法检索这些释放的块或数组,即:

array:     1 2 3 2 4 6 4 8 12
stack no:  1 2 3 1 2 3 1 2 3
从堆栈2弹出两次后,我们将得到:

array:     1 2 3 2 - 6 4 - 12
stack no:  1 2 3 1 2 3 1 2 3
所以我们失去了对已删除块的引用,我们只能在数组的“右侧”添加元素。作者说,这可以通过上面提供的代码来克服。但我看不出他会怎么做,如果
他分配了数组StackNode,然后通过将堆栈顶部设置为适当的前一个顶部(stackPointer)并将弹出值设置为null,然后减少数组中当前最大的元素来弹出每个元素??对我来说,它仍然会分割数组,并额外跳过一些其他栈顶元素。唯一合理的方法是,如果我们的数组作为列表使用,并且赋值“buffer[lastIndex]=null”将从列表中删除该节点,那么我们可以说,通过索引--,数组中少了一个元素。

这个问题感觉有点诱饵,请转到我这里。它询问如何使用单个数组实现堆栈。在前四行代码中,已经声明了两个数组(一个int数组和一个StackNodes数组)。是的,我知道你可以只使用三个int变量。不过,在“答案”中有两个数组有点违背了问题的目的。但从本质上说,答案是有道理的。您只需要实现一个包含三个指针的数组,每个指针指向堆栈的“顶部”。然后,当你弹出一个元素时,你将该位置置零,并将指针移动到新的“顶部”,问题感觉有点像诱饵,然后转向我。它询问如何使用单个数组实现堆栈。在前四行代码中,已经声明了两个数组(一个int数组和一个StackNodes数组)。是的,我知道你可以只使用三个int变量。不过,在“答案”中有两个数组有点违背了问题的目的。但从本质上说,答案是有道理的。您只需要实现一个包含三个指针的数组,每个指针指向堆栈的“顶部”。然后,当弹出一个元素时,将该位置设为空,并将指针移动到新的“顶部”