java - 用一个数组实现三个Stack

标签 java

我看到下面的 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/

相关文章:

java - 执行 shell 命令时永远挂起 (Java)

java - 寻找一个类似Cppcheck的Java开发工具

java - 使用@DefaultProperty时为"Element does not define a default property"

java - Appium 滚动操作发生两次

java - 克隆载体仍然被覆盖

java - "export as runnable JAR"选项丢失

java - 如何向 list 文件添加权限(Java Applet)

java - 如何在 Java 中使用 HttpSession 跟踪登录尝试?

javax.mail.MessagingException : Could not connect to SMTP host: email-smtp. us-east-1.amazonaws.com,端口:25;

java - 发送对象和线程同步