我看到下面的 Java 代码用于在单个数组上实现三个堆栈。
1 int stackSize = 300;
2 int indexUsed = 0;
3 int[] stackPointer = {-1,-1,-1};
4 StackNode[] buffer = new StackNode[stackSize * 3];
5 void push(int stackNum, int value) {
6 int lastIndex = stackPointer[stackNum];
7 stackPointer[stackNum] = indexUsed;
8 indexUsed++;
9 buffer[stackPointer[stackNum]]=new StackNode(lastIndex,value);
10 }
11 int pop(int stackNum) {
12 int value = buffer[stackPointer[stackNum]].value;
13 int lastIndex = stackPointer[stackNum];
14 stackPointer[stackNum] = buffer[stackPointer[stackNum]].previous;
15 buffer[lastIndex] = null;
16 indexUsed--;
17 return value;
18 }
19 int peek(int stack) { return buffer[stackPointer[stack]].value; }
20 boolean isEmpty(int stackNum) { return stackPointer[stackNum] == -1; }
21
22 class StackNode {
23 public int previous;
24 public int value;
25 public StackNode(int p, int v){
26 value = v;
27 previous = p;
28 }
29 }
我的问题1是第4行已经为变量buffer分配了内存。为什么在第9行,我们还需要分配新的StackNode。
我的问题2是:pop这个函数可以帮助回收使用过的内存吗?
例如,
Stack1_E1 => Stack1_E2 => Stack2_E1 => Stack2_E2 => Stack3_E1
当我们调用 pop(0)//弹出 Stack1 根据我的理解,Stack1_E2使用的空闲空间在下次调用push时不会被重复使用。
函数 pop 是否设计正确? 谢谢
注:本题已修改,包含pop函数。
最佳答案
Question 1: Line 4 has allocated memory for the variable buffer. Why in Line 9, we still need to allocate new StackNode.
第 4 行创建一个 引用 到 StackNode
对象的数组。然后在第 9 行创建实际的 StackNode
对象。
Question 2: Can the function pop help recollect the used memory?
pop
函数从栈中获取下一个值对象(StackNode.value
),并在数组中设置相应的StackNode
引用为 null
。此 StackNode
使用的内存将被垃圾收集,因为 StackNode
不再被引用。当对象不再使用(即不再被调用者或其他对象引用)时,值对象本身使用的内存将被垃圾回收
关于java - 用一个数组实现三个Stack,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4239292/