java - 理解下面的Push操作

标签 java 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行都可以去掉。

关于java - 理解下面的Push操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33362513/

相关文章:

java - int[ ] 和 Integer [ ] 之间有什么区别

java - 创造无 body Activity

java - GIT:如何使用cherry-pick在两个分支中提交

javascript嵌套数组

html - 需要有关 Bootstrap Pull Push 问题的帮助

c++ - 将函数从 Hook 的 dll 复制到进程内存中

java - java链表中被删除的节点会发生什么?

java - mvvmFX 在 ViewTuple 中为已实现的 ViewModel 抛出不兼容的类型

java - android中的子类ArrayAdapter用于显示ArrayList

nginx - 使用 nginx 进行 HTTP2 推送?