理解下面的Push操作
Understanding the following Push operation
我在理解下面的代码时遇到了一些困难。 push操作和栈的部分我特别难懂
谁能详细解释一下它是如何工作的?
package stack;
// Implement a "growable" stack.
class DynStack implements IntStack {
private int stck[];
private int tos;
// allocate and initialize stack
DynStack(int size) {
stck = new int[size];
tos = -1;
}
// Push an item onto the stack
public void push(int item) {
// if stack is full, allocate a larger stack
if(tos == stck.length-1) {
int temp[] = new int[stck.length * 2]; // double size
for(int i=0; i<stck.length; i++) temp[i] = stck[i];
stck = temp;
stck[++tos] = item;
}
else
stck[++tos] = item;
}
// Pop an item from the stack
public int pop() {
if(tos < 0) {
System.out.println("Stack underflow.");
return 0;
}
else
return stck[tos--];
}
}
class IFTest2 {
public static void main(String args[]) {
DynStack mystack1 = new DynStack(5);
DynStack mystack2 = new DynStack(8);
// these loops cause each stack to grow
for(int i = 0; i < 12; i++) mystack1.push(i);
for(int i = 0; i < 20; i++) mystack2.push(i);
System.out.println("Stack in mystack1:");
for(int i = 0; i < 12; i++)
System.out.println(mystack1.pop());
System.out.println("Stack in mystack2:");
for(int i = 0; i < 20; i++)
System.out.println(mystack2.pop());
}
}
这里有一个简单的解释:
tos
是指向栈尾的指针。 Push 将一个元素添加到堆栈的末尾。所以首先我们检查我们是否指向最后一个元素。如果是这样,除非我们调整堆栈的大小以容纳更多元素,否则我们无法添加元素。所以我们创建一个新的临时堆栈,大小加倍:
int temp[] = new int[stck.length * 2];
下一步是将我们的项目从旧堆栈放入新的临时堆栈,我们通过使用这个 for 循环来实现:
for(int i=0; i<stck.length; i++) temp[i] = stck[i];
完成后,我们需要将这个临时堆栈设为新堆栈:
stck = temp;
然后我们在最后一个位置添加项目:
stck[++tos] = item;
其实这一行和else行可以去掉
我在理解下面的代码时遇到了一些困难。 push操作和栈的部分我特别难懂
谁能详细解释一下它是如何工作的?
package stack;
// Implement a "growable" stack.
class DynStack implements IntStack {
private int stck[];
private int tos;
// allocate and initialize stack
DynStack(int size) {
stck = new int[size];
tos = -1;
}
// Push an item onto the stack
public void push(int item) {
// if stack is full, allocate a larger stack
if(tos == stck.length-1) {
int temp[] = new int[stck.length * 2]; // double size
for(int i=0; i<stck.length; i++) temp[i] = stck[i];
stck = temp;
stck[++tos] = item;
}
else
stck[++tos] = item;
}
// Pop an item from the stack
public int pop() {
if(tos < 0) {
System.out.println("Stack underflow.");
return 0;
}
else
return stck[tos--];
}
}
class IFTest2 {
public static void main(String args[]) {
DynStack mystack1 = new DynStack(5);
DynStack mystack2 = new DynStack(8);
// these loops cause each stack to grow
for(int i = 0; i < 12; i++) mystack1.push(i);
for(int i = 0; i < 20; i++) mystack2.push(i);
System.out.println("Stack in mystack1:");
for(int i = 0; i < 12; i++)
System.out.println(mystack1.pop());
System.out.println("Stack in mystack2:");
for(int i = 0; i < 20; i++)
System.out.println(mystack2.pop());
}
}
这里有一个简单的解释:
tos
是指向栈尾的指针。 Push 将一个元素添加到堆栈的末尾。所以首先我们检查我们是否指向最后一个元素。如果是这样,除非我们调整堆栈的大小以容纳更多元素,否则我们无法添加元素。所以我们创建一个新的临时堆栈,大小加倍:
int temp[] = new int[stck.length * 2];
下一步是将我们的项目从旧堆栈放入新的临时堆栈,我们通过使用这个 for 循环来实现:
for(int i=0; i<stck.length; i++) temp[i] = stck[i];
完成后,我们需要将这个临时堆栈设为新堆栈:
stck = temp;
然后我们在最后一个位置添加项目:
stck[++tos] = item;
其实这一行和else行可以去掉